使用boost :: variant指向成员函数的指针

时间:2011-12-07 18:18:47

标签: c++ pointers boost casting

我试图定义一个指向成员函数的“泛型”指针,该指针可用于访问特定类中的各种成员函数,如下所示:

class Security{
    inline std::vector<double> member_function(const std::string &input_data_string){ return ... a vector<double>....;};
    };

我通过使用boost :: variant来定义一个指向成员函数的泛型指针,该指针可用于访问“OTHER”函数以及不同的返回类型以及不同的类型参数。

typedef boost::variant<std::string,double, std::vector<double>, std::vector<std::string>>  (Security::*ptr_sec_fn)(boost::variant<std::string,double, std::vector<double>, std::vector<std::string>> );

然后将指针指定给成员函数

    ptr_sec_fn=&Security::member_function;

这是我得到的错误:

cannot convert from 'std::vector<_Ty> (__thiscall Security::* )(const std::string &)' to 'boost::variant<T0_,T1,T2,T3> (__thiscall Security::* )(boost::variant<T0_,T1,T2,T3>)'
1>          with
1>          [
1>              _Ty=double
1>          ]
1>          and
1>          [
1>              T0_=std::string,
1>              T1=double,
1>              T2=std::vector<double>,
1>              T3=std::vector<std::string>
1>          ]
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

请你帮我确定一下我在做错了什么?非常感谢你。

2 个答案:

答案 0 :(得分:0)

这不能以这种方式工作。有人必须进行从向量到变量类型的转换,并且你的函数不能这样做(因为它返回一个向量,而这就是它所知道的全部)并且创建指针的代码也不能这样做(因为它无法动态创建功能。)

另一方面,您可能想要重新考虑您的设计。为什么你还需要一个这样的通用函数指针?可以更具体地说明吗?一个好的设计通过清晰的类型显示出来,因为类型向程序员展示了比任何文档更准确的数据。

答案 1 :(得分:0)

Security::member_function的类型是std::vector<Ty> (_thiscall Security::* )(const std::string &),它与您尝试将其分配的指针类型完全不同。这是不允许的。您只能将获取并返回该变量的成员函数分配给该类型的成员函数指针。

如果这个赋值有效,那么试图调用你的成员函数指针的代码会将一个变量传递给该函数,并且该函数将被破坏,因为它需要一个字符串。任何人都没有足够的信息知道有人需要以某种方式从你的变体中获取一个字符串。即使所有这些都有效,当函数返回向量时,有人需要知道向量需要用于构造变量。这必须在呼叫站点完成,但呼叫站点甚至不知道正在返回一个向量。你知道返回什么类型的事实是不够的,编译器必须知道它。而且你知道类型的事实表明你不应该首先使用全能类型。你应该使用正确的类型。

如果你有一堆重载函数接受和返回不同的类型,你将无法拥有一个可以指向任何重载的成员函数指针。试图这样做完全忽略了C ++中的类型安全性。所以你必须考虑一种类型安全的方式来做你想做的事。

我们需要更多关于您的目标是什么来帮助您找到实现方法的信息,但您目前正在尝试的是永远不会起作用。