gpt4 book ai didi

c++ - 如果链接了两个模板的类型,如何使用策略模板?

转载 作者:行者123 更新时间:2023-11-30 04:32:26 28 4
gpt4 key购买 nike

我目前正在编写一个允许获取和设置内部程序选项的类,它应该非常灵活且易于使用。具体来说,一个选项由一个枚举类型和一个值类型来标识,它们具有一对一的关系。例如,枚举 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>, ...{
...
}

每个枚举常量都有一个关联的字符串表示形式,它是常量,但选项也作为程序的字符串输入,因此我必须能够从字符串中推断出我应该更改哪个选项。

但显然,如果不限定其完整的模板特化,这段代码不能用于直接调用 set 或获取值。所以

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

将不起作用。

关于我应该使用什么来让它工作的任何指示?

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

提前致谢,兄弟们

最佳答案

不必同时传递Enum 类型。多亏了 traits 类,您可以从类型本身推断出枚举值:

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或许还可以使用他们的图书馆。

关于c++ - 如果链接了两个模板的类型,如何使用策略模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659103/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com