2011-10-05 47 views
1

我目前正在写的一类,它允许获取和设置INTERAL程序选项,它应该是相当灵活,易于使用。 具体而言,一个选项由枚举类型和值类型标识,它们具有一对一的关系。例如,枚举IntType上意愿包含具有INT类型的选项。如果两个模板的类型链接,如何使用策略模板?

我心目中的下面的代码,但不知道如何得到它的工作或我是否想在某种程度上我不应该使用的模板。

enum IntType {OPTION1, OPTION2} 
enum StringType { OPTION3, OPTION4} 

template<class T, class T2> 
class Policy{ 
public: 
    T2 getValue(const T& a); 
    void setValue(const std::string& name, const T2& a); 
    ... 
} 

class A: public Policy<IntType, int>, public Policy<Stringtype, std::string>, ...{ 
    ... 
} 

每个枚举常数具有一个相关联的字符串表示,这是不变的,但选择也作为字符串输入到程序中,所以必须要能够从我应该改变哪个选项的字符串来推断。

但显然,不能用此代码来直接调用设置或获取价值,而不必限定其全模板特殊化。所以

A* a = ... 
a->setValue("intoption", 5); 

将无法​​正常工作。

上我应该用什么来得到这个工作的任何指针?

关于如何在编译时派生出OPTION1映射到int和IntType的部分答案,也会很棒。

由于提前, Broes

+0

你的第一个模板参数是你的枚举吗?为什么不简单通过价值传递呢? – Geoffroy

+0

我更新了问题,因为枚举规范不够清楚。 –

+0

好吧,现在我明白你的意思了;) – Geoffroy

回答

2

这是没有必要通过两个Enum类型。你可以从类型本身中推导出枚举值,这要归功于一个特征类:

template <typename T> 
struct PolicyTraits; 

template <> 
struct PolicyTraits<int> { static Enum const value = IntType; } 

// ... and so on ... 

你的选择显然有点困难。要使模板正常工作,您需要基于编译常量选择,无论它们是常量还是类型。这要求你的选项名称是常量。因此

修订的实施将是:

template<class Name, class Type> 
class Policy{ 
public: 
    Type getValue(Name); 
    void setValue(Name, Type const&); 
    ... 
} 

这可以作为:

struct IntOption {}; 

class A: public Policy<IntOption, int> {}; 

int main() { 
    A a; 
    a.setValue(IntOption(), 3); 
} 

此外,您可能会感兴趣的仰视How Boost does it也许使用他们的图书馆。

+0

这不是我想到的,但是有了你的信息和“现代C++设计”的一些帮助,我找到了答案。主要观点是创建一个具有嵌入式typedef的traits类用于我的类型。 –

0

既然你是填充在运行时的数据,template s为不可行的这种设计。运行时多态性与virtual函数将是一个不错的选择。例如,现在

class Options; // Say this is the class of interest 

class DataType { 
public: 
    virtual Options& getOptions() = 0; 
}; 

class IntType : public DataType { 
public: 
    Options& getOptions(); // implement for 'int' type 
}; 

class StringType : public DataType { 
public: 
    Options& getOptions(); // implement for 'std::string' type 
}; 

class A应包含一个指向DataType;

class A { 
    DataType *pData; 
public: 
    void setValue (DataType *p) { pData = p; } 
... 
}; 

用法:

A *a = ...; 
a->setValue(new IntType); // take care of heap allocation/stack allocation 
相关问题