来自模板参数的 C++ 通用模板方法名称

标签 c++ templates c++11

我从 C++11 中的可变参数模板开始,我想知道是否可以创建一个从模板参数中获取其名称的结构/类方法

类似于:

MySmartTemplate<"foo", int, "bar", double> MyStruct;

// which should result in:
struct MyStruct
{
   void foo(int val){...}
   void bar(double val){...}
};

其中模板参数可能成对出现,如 +

谢谢

最佳答案

模板根本不可能做到这一点。 C++ 中的模板由一个或多个模板参数列表参数化。他们每个人都可以是:

  • 一个非类型模板参数;
  • 类型模板参数;
  • 一个模板模板参数。

现在,为了能够(理论上)构建类似 void foo(int val){...} 的东西,您需要将“foo”的名称及其参数类型传递到我们的虚构的模板。虽然传递 val 的类型不是问题,但传递“foo”的名称是不可能的。您可以使用的唯一非类型模板参数是:

  • std::nullptr_t;
  • 整体型;
  • 左值引用类型(对象或函数);
  • 指针类型(指向对象或函数);
  • 指向成员类型(指向成员对象或成员函数)的指针;
  • 枚举类型。

您还应该注意,引用和指针类型的非类型模板参数有一些异常(exception),即它们不能引用或作为字符串文字的地址(相关:this question)。考虑到上述情况,无法将字符串文字传递给模板,因此无法使用模板实现您想要的。

附带说明一下,虽然可变参数模板是对语言的一个很好的补充,但它们有一些限制,即您只能执行参数包的扩展,但不能处理包中的单个参数。

因此,总而言之,不,模板无法满足您的需求。

关于来自模板参数的 C++ 通用模板方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099226/

相关文章:

c++ - Windows 有默认的单词词典吗?

c++ - 我需要通过基类静态变量访问派生类成员

c++ - 模板类型名实例化错误

c++ - 使用 static_assert 确定特定模板参数是否为特定无类型类模板

c++ - 如果我们不等待就发出信号量会发生什么?

c++ - 在 Windows/Linux 中检查对文件的写入权限

c++ - 在嵌套类型中保留 volatile

css - Joomla 文章/列插入填充

c++ - `std::make_tuple` 的原因是什么?

c++ - 为了整洁起见,在另一个文件中定义前向声明的嵌套结构/类/枚举