Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++_Templates_Runtime - Fatal编程技术网

运行时模板实例化和函数选择 我对C++很陌生,我正在努力实现一些棘手的事情,因为我找不到满意的解决方案。

运行时模板实例化和函数选择 我对C++很陌生,我正在努力实现一些棘手的事情,因为我找不到满意的解决方案。,c++,templates,runtime,C++,Templates,Runtime,假设我有两个功能: template <class T1, class T2> void foo(T1 param1, T2 param2){...}; template <class T1, class T2> void bar(T1 param1, T2 param2){...}; 但是这个解决方案很难看,不可扩展(我希望能够添加更多的函数和更多的模板参数),等等。而且,我也看不到将函数foo或bar分配给函数指针的方法,因为在运行之前模板参数是未知的 所以,如果

假设我有两个功能:

template <class T1, class T2> void foo(T1 param1, T2 param2){...}; 
template <class T1, class T2> void bar(T1 param1, T2 param2){...};
但是这个解决方案很难看,不可扩展(我希望能够添加更多的函数和更多的模板参数),等等。而且,我也看不到将函数
foo
bar
分配给函数指针的方法,因为在运行之前模板参数是未知的

所以,如果有人能为我提供一个好的,干净的解决方案,我会非常高兴!干杯

编辑让我澄清几件事

我正在访问二进制文件,其中的数据可以存储为
浮动
双倍
。显然,程序无法知道这种类型,因此用户必须以某种方式指定它


然后必须对从文件加载的数据进行一些数学计算。有几种可能的计算,上面用函数
foo
bar
表示


所以我希望用户能够在运行时指定文件中数据的类型,然后选择一个函数在运行时应用于加载的数据。
开关(c)
只是一个例子,说明了我认为用户可以如何选择这些东西。

您不能使用指向函数模板的指针,因为它们不是函数,但需要先实例化。您可以得到如下指针:

typedef void (*Tfkt_int_int)( int, int );
Tfkt_int_int Ptr = &foo<int,int>;
typedef void(*Tfkt_int_int)(int,int);
Tfkt_int_int Ptr=&foo;
如您所见,您需要指定可能的类型组合

如果有很多函数,并且需要更干净的代码,那么可以将共享相同签名的所有函数放在一个映射中。(也就是说,每个签名需要一个映射。)然后区分在switch语句中使用哪个映射

std::map<char, Tfkt_int_int> Map_int_int;
Map_int_int['a'] = &foo<int,int>;
Map_int_int['b'] = &bar<int,int>;
// more ...

typdef void (*Tfkt_int_double)( int, double );
std::map<char, Tfkt_int_double> Map_int_double;
Map_int_double['a'] = &foo<int,double>;
Map_int_double['b'] = &bar<int,double>;
// more ...
std::map\u int\u int;
Map_int_int['a']=&foo;
Map_int_int['b']=&bar;
//更多。。。
类型定义无效(*Tfkt_int_double)(int,double);
std::map\u int\u double;
Map_int_double['a']=&foo;
Map_int_double['b']=&bar;
//更多。。。
如果您只需要一个映射,并且愿意牺牲一些savety类型,那么可以转换参数类型。在这种情况下,这可能不会造成太大损失,因为您已经从字节流中读取了数据

template <class T1, class T2> void foo(char* param1, char* param2)
{
  T1 P1 = *(reinterpret_cast<T1*>( param1 ));
  T2 P2 = *(reinterpret_cast<T2*>( param2 ));
  // ...
};

typedef void (*Tfkt)( char*, char* );
std::map<char, Tfkt> Map;
Map['a'] = &foo<int,int>;
Map['b'] = &foo<int,double>;
// more ...
模板void foo(char*param1,char*param2)
{
T1 P1=*(重新解释铸造(参数1));
T2 P2=*(重新解释铸造(参数2));
// ...
};
typedef void(*Tfkt)(字符*,字符*);
地图;
Map['a']=&foo;
Map['b']=&foo;
//更多。。。
然后呼叫:

double d;
int i;
char c = 'b';
(*(Map[c]))( reinterpret_cast<char*>(&i), reinterpret_cast<char*>(&d) );
double-d;
int i;
字符c='b';
(*(地图[c])(重新解释铸型(&i),重新解释铸型(&d));

您能否提供一些您想要实现的背景信息?调用应该遵循的模式到底是什么(与
c
相关)?模板在运行时不起作用。您可以制作一个
unordered_映射
foo
bar
不是函数,它们是函数模板。您可以通过实例化它们来创建函数。不能在运行时实例化模板。这不是什么大问题,因为您无法从用户处获取类型。世界上所有的用户输入都是字节流。您只能尝试将给定的字节流转换为编译时必须事先知道的某种类型的值。因此,您在编译时有一组类型,可以用来实例化模板。最简单的解决方案是只使用一个内部表示形式-双精度-并仅在文件输入/输出期间转换。如果这是不可行的,那么下一个最简单的事情就是定义一个抽象接口,该接口不涉及浮点或双精度(仅文件名、操作代码和备忘录类型)、一个通过操作存储的数据(包括输入/输出)实现该接口的类模板,以及一个实例化处理器(文件名)的工厂函数等等,基于一些参数。你的回答确实帮助我解决了我的问题,尽管我并没有以那种方式实施它。谢谢
double d;
int i;
char c = 'b';
(*(Map[c]))( reinterpret_cast<char*>(&i), reinterpret_cast<char*>(&d) );