Variadic Sequence的C ++模板和代码生成:如何为每个参数/类型创建类似的代码块?

时间:2011-11-30 18:26:35

标签: c++ templates boost code-generation boost-preprocessor

我想知道我们是否可以拥有这样的类(伪代码):

template <class Arg1T, ... class ArgNT>
class my_class
{
public:
    my_class(Arg1T Arg1, std::string Arg1_name  ... ArgNT  ArgN, std::string ArgN_name){}
};

如果我们可以在编译时使用定义为每个提供的参数类型自动生成一个函数,例如获取类似(伪代码)的内容:

template <class Arg1T, ... class ArgNT>
class my_class
{
public:
    my_class(Arg1T Arg1, std::string Arg1_name  ... ArgNT  ArgN, std::string ArgN_name){}
    // for each Arg we want to create a function like
    ArgMT   my_class_function(std::string name)
    {
       if(name == ArgM_name)
          return ArgM;
    }

};

在现代C ++中是否可以使用这种/或类似的东西以及如何创建它?

我想说的是:我想为某些函数模板提供给构造函数的每个类类型生成函数。并且想知道怎么做这样的事情?这里显示how to repeat但是如何重复提供给类参数和类型?

我的意思是,如果我们知道大量的类型模板参数(N),我们可以创建不同类型的变量N(每个参数一个)和N个字符串(所有私有)所以我们可以为那些(字符串+变量)(我们在构造函数中调用)的setter和getter创建N函数。这里的主要问题是 - 如何解决两次或两次以上相同类型的时间,如何从boost.preprocessor获取大量的args,如何过滤相同的类型?

2 个答案:

答案 0 :(得分:0)

您不能仅根据返回类型重载函数,所以不,这是不可能的。

如果您从图片中取出参数名称和my_class_function,则会留下std::tuple<T0, ..., Tn>。您可以使用std::get<N>来获取第N个参数(但它完全是编译时构造,N不能在运行时确定)。

如果您确实需要运行时处理,那么从std::stringboost::variant的映射可能会有效。

答案 1 :(得分:0)

我认为在这种情况下,您通常可以使用接口和工厂方法。