繁体   English   中英

运行时的模板实例化和函数选择

[英]Template instantiation and function selection at runtime

我对c ++很陌生,我正在努力实现一些有点棘手的东西,我似乎无法找到一个令人满意的解决方案。

假设我有这两个功能:

template <class T1, class T2> void foo(T1 param1, T2 param2){...}; 
template <class T1, class T2> void bar(T1 param1, T2 param2){...};

在运行时,我想选择这两个函数,并使用从用户输入获得的一些模板类型来实例化它,例如char c 所以我可以这样做:

double d;
float f;
switch(c) {
    case 'a':
        foo(d, f); break;
    case 'b':
        foo(f, d); break;
    case 'c':
        bar(d, f); break;
    case 'd':
        bar(f, d); break;

但是这个解决方案很丑,不可扩展(我希望能够添加更多功能,以及更多模板参数)等等。而且,我也看不到将foobar函数指定给函数指针的方法,因为模板参数在运行时之前是未知的。

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

编辑让我澄清一些事情。

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

然后必须对从文件加载的数据进行一些数学计算。 并且有几种这样的计算是可能的,上面用函数foobar

所以,我希望用户能够在运行时指定的文件中的数据的类型,然后选择一个功能在运行时应用到加载的数据 switch(c)只是说明了我认为用户可以选择这样的东西。

你不能指向函数模板,因为它们不是函数,但需要先实例化。 你可以得到这样的指针:

typedef void (*Tfkt_int_int)( int, int );
Tfkt_int_int Ptr = &foo<int,int>;

如您所见,您需要指定可能的类型组合。

如果有很多,并且您想要更清晰的代码,则可以将共享相同签名的所有函数放入一个映射中。 (也就是说,每个签名需要一个映射。)然后区分要在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 ...

如果你只想要一个地图,并且愿意牺牲一些类型的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 ...

然后打电话给:

double d;
int i;
char c = 'b';
(*(Map[c]))( reinterpret_cast<char*>(&i), reinterpret_cast<char*>(&d) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM