std :: string of map< - >函数对,其中函数具有模板参数

时间:2016-09-23 16:59:17

标签: c++ c++11

我试图创建一个字符串到函数指针的映射,但是有一个扭曲 - 函数有一个模板参数。这就是我的尝试:

template <typename T>
using func = void (*) (T);

std::map<std::string, func> funcMap;
funcMap["test1"] = &Test::test1;
funcMap["test2"] = &Test::test2; 

测试看起来像:

class Test
{
void test1(SomeClass arg) {}
void test2(SomeOtherClass arg) {}
};

我尝试的是什么?还有更好的方法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

在保持类型安全的情况下,您尝试做的事情是不可能的。映射必须使所有数据成员具有相同的类型。这样编译器就可以进行类型检查,以确保返回的指针在对象上调用是有效的。

答案 1 :(得分:0)

考虑模板:它是生成代码的编译时模板(在通用英语意义上)。模板类型别名是生成类型别名的模板:

template <typename T>
using func = void (*) (T);

func 类型甚至是类型别名;但是func<SomeClass>func<SomeOtherClass> 。具体而言,func<SomeClass>void (*) SomeClass的别名。

现在,请考虑std::map是什么:它将特定类型的键映射到特定类型的值。所有值的类型必须相同,因此必须完全指定类模板,以便它们是真实类型,而不再仅仅是生成类型的模板。

所以,不,如果你想调用具有不同参数的函数(或成员函数)指针,你不能将它们全部存储在与值相同的std::map中,除非你绕过类型系统,例如:使用某种标记的union函数指针类型作为map的值类型。

(作为旁注:看起来你可能正在尝试实现类似Qt的命名信号和插槽框架。你有没有考虑过使用Qt?)

答案 2 :(得分:0)

正如它在cplusplus.com&#34上所说的那样;地图中的每个元素都将一些数据存储为其映射值。&#34;这意味着密钥需要某种值。所以我认为它不会直接存储函数指针来调用不同的参数,但你可以尝试使用union,就像我在这个项目中实现的那样 - code

查看链接中的完整代码,但是为了了解如何尝试使用与地图的联合,我在这里添加了一小段代码:

std:: map<int,union shape_ptr> myData;
myData[0].tri_ptr=&t1;
myData[1].tri_ptr=&t2;
myData[2].cir_ptr=&c1;
myData[3].cir_ptr=&c2;

std::map<int, union shape_ptr> :: iterator it=myData.begin();
for(it=myData.begin();it!=myData.end();it++)
{
  do_poly(it->second); //do_poly call the function from map
}