可变序列 : How to create similar code block for each argument/type? 的 C++ 模板和代码生成

标签 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 字符串(全部私有(private)),因此我们可以为它的 setter 和 getter 创建 N 函数(字符串 + 变量)(我们将在构造函数中调用)。这里的主要问题是 - 如何解决相同类型两次或更多次的问题,如何从 boost.preprocessor 获取大量参数,如何过滤相同类型?

最佳答案

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

如果您使用参数名称和 my_class_function在图片之外,您剩下 std::tuple<T0, ..., Tn> .您可以使用 std::get<N>然后获取第 N 个参数(但这完全是编译时构造,无法在运行时确定 N)。

如果你真的需要运行时处理,那么映射自std::stringboost::variant超过 N 种类型可能有效。

关于可变序列 : How to create similar code block for each argument/type? 的 C++ 模板和代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330950/

相关文章:

c++ - 为什么在线编译器会拒绝此 VLA 代码,但本地 Apple clang 不会?

c++ - 错误 C2440 : 'initializing' : cannot convert from 'std::vector<_Ty>' to 'const std::vector<_Ty> &`

c++ - 具有局部变量初始化延迟的 constexpr 函数

c++ - 如何使用 C++ 中的通用 vector 对动态内存中的对象列表进行排序?

从 Boost object_pool 构造的指针的 C++ Boost 二进制序列化

c++ - 如何构建垃圾收集器?

c++ - 如何调用模板函数的每个实例化函数?

c++ - 继承默认模板值

c++ - 以高效的方式创建、访问、存储和加载 boost::bimap

c++ - 来自 `boost::asio::streambuf`