【问题标题】:C++ templates and code generation for Variadic Sequence: How to create similar code block for each argument/type?可变参数序列的 C++ 模板和代码生成:如何为每个参数/类型创建类似的代码块?
【发布时间】:2012-01-09 23:37:33
【问题描述】:

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

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 数量,如何过滤相同类型?

【问题讨论】:

  • 您能澄清一下您要做什么吗?我现在看到的是基于返回类型的重载函数。
  • 参见stackoverflow.com/questions/203667/…(和 Boost 参数库)
  • @sehe:参数库似乎完全不相关......并且没有提供任何返回类型的帮助

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


【解决方案1】:

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

如果你把参数名称和my_class_function 去掉,你就剩下std::tuple&lt;T0, ..., Tn&gt;。您可以使用std::get&lt;N&gt; 获取第 N 个参数(但它完全是编译时构造,N 无法在运行时确定)。

如果您确实需要运行时处理,那么从 std::stringboost::variant 的 N 种类型的映射可能会起作用。

【讨论】:

  • @myWallJSON: std::tuple 是编译时。如果你想要编译时构造,你不能使用std::string
  • 如果我们知道类模板参数的数量(N),我们可以创建不同类型的N变量(每个参数一个)和N字符串(都是私有的)等等我们可以为该字符串 nd 变量(我们将在构造函数中调用)的 setter 和 getter 创建 N 个函数。这里的主要问题是 - 如何解决两次或多次获得相同类型的时间。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多