我试图创建一个字符串到函数指针的映射,但是有一个扭曲 - 函数有一个模板参数。这就是我的尝试:
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) {}
};
我尝试的是什么?还有更好的方法吗?谢谢!
答案 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
}