Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板参数中的泛型模板方法名称_C++_Templates_C++11 - Fatal编程技术网

C++ C++;模板参数中的泛型模板方法名称

C++ C++;模板参数中的泛型模板方法名称,c++,templates,c++11,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){...} }; mysmart模板MyStruct; //这将导致: 结构MyStruc

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

比如:

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

// which should result in:
struct MyStruct
{
   void foo(int val){...}
   void bar(double val){...}
};
mysmart模板MyStruct;
//这将导致:
结构MyStruct
{
void foo(int val){…}
空条(双值){…}
};
其中模板参数可能成对出现为+


谢谢

这在模板中根本不可能实现。C++中的模板由一个或多个模板参数的列表参数化。其中每一项都可以是:

  • 非类型模板参数
  • 类型模板参数
  • 模板参数
现在,为了能够(理论上)构造类似于
voidfoo(intval){…}
,您需要将“foo”的名称及其参数类型传递到我们想象的模板中。虽然传递
val
的类型不是问题,但传递“foo”的名称是不可能的。您可以使用的唯一非类型模板参数是:

  • std::nullptr\t
  • 积分型
  • 左值引用类型(对象或函数)
  • 指针类型(指向对象或函数)
  • 指向成员类型的指针(指向成员对象或成员函数)
  • 枚举类型
您还应该注意,引用类型和指针类型的非类型模板参数有一些例外,即它们不能引用字符串文本或作为字符串文本的地址(related:)。综上所述,无法将字符串文本传递给模板,因此不可能使用模板实现所需的功能

另一方面,虽然可变模板是该语言的一个很好的补充,但它们有一些限制,即您只能执行参数包的扩展,但不能处理包中的单个参数


因此,总而言之,不,您想要的是模板

不幸的是,没有。模板机制只允许您享受类型泛型的乐趣,即创建可以使用多种类型的函数/对象,或者为不同的输入类型创建略有不同的实现,或者使返回类型依赖于模板参数等。通常,模板元编程引入了所谓的静态多态性。这是一个
编译器
阶段的特性(签出),这意味着它在所有名称被修复后完成(函数
foo()
将始终被调用
foo
,即使编译器决定将其与
int
参数一起使用)

您试图实现的是进入
proprocessor
阶段,在该阶段中,可以使用修改源代码。这是您可以使用宏的时刻。对于您的示例,您可以使用以下内容:

#include <iostream>

using namespace std;

#define MySmartTemplate(StructName, Func1Name, Func1ArgType, Func2Name, Func2ArgType) \
struct StructName \
{ \
    void Func1Name(Func1ArgType val) { cout << "func1" << endl; } \
    void Func2Name(Func2ArgType val) { cout << "func2" << endl; } \
};

MySmartTemplate(MyStruct, foo, int, bar, double);

int main()
{
    MyStruct myStruct;
    myStruct.foo(1);
    myStruct.bar(1);
}
#包括
使用名称空间std;
#定义MySmartTemplate(结构名、Func1Name、Func1ArgType、Func2Name、Func2ArgType)\
结构名\
{ \

void Func1Name(Func1ArgType val){cout No。但是可以使用预处理器宏。简短且唯一的答案是,不,这是不可能的,不管怎么说,模板都不行……好吧,这不太好。如果函数“name”被一个索引替换,比如元组<…>get(i)会怎么样?@xy,你可以将函数指针存储在一个映射中,然后通过作为模板参数传递的索引将它们从映射中取出,但我不明白你为什么需要使用模板。除了添加/删除一些模板参数之外,这是关于排序的。假设模板参数的顺序很重要,那么参数包中的第一个功能与其他功能有所不同……”模板机制只允许您享受类型泛型的乐趣,即创建可以处理多种类型的函数/对象”因此,如果我将不同的函数指针作为模板参数传递,它会-有点-模拟我的想法…,我会看看,但感谢您的澄清。。。