C++ 是否可以声明一个指向未知(编译时)返回类型函数的指针
我有一个C++ 是否可以声明一个指向未知(编译时)返回类型函数的指针,c++,function,function-pointers,C++,Function,Function Pointers,我有一个类,其中我希望有一个指向函数的指针作为数据成员: class A { protected: double (*ptrToFunction) ( double ); public: ... //Setting function according to its name void SetPtrToFunction( std::string fName ); }; 但是,如果我希望ptrToFunction有时是double,有时是-int,那该怎么办呢 //
类
,其中我希望有一个指向函数的指针作为数据成员:
class A
{
protected:
double (*ptrToFunction) ( double );
public:
...
//Setting function according to its name
void SetPtrToFunction( std::string fName );
};
但是,如果我希望ptrToFunction
有时是double
,有时是-int
,那该怎么办呢
//T is a typename
T(*ptrToFunction) ( double );
在这种情况下,我应该如何声明它?A可以为您这样做:
class A
{
template<T>
using cb_type = T(double);
protected:
enum {IS_INT, IS_DOUBLE} cb_tag;
union {
cb_type<int> *ptrToIntFunction;
cb_type<double> *ptrToDoubleFunction;
};
public:
...
// Setting function according to its name
void SetPtrToFunction( std::string fName );
};
最后,如果您确实关心返回值,但不想存储有差别的联合。然后了解联合和
std::function
的行为,就可以将上述两种方法结合起来
#包括
#包括
#包括
int foo(双d){return d;}
双条(双d){返回2*d;}
结构结果{
联合{
国际组织;
双d_res;
};
枚举{IS_INT,IS_DOUBLE}u_标记;
结果(结果常数&)=默认值;
结果(inti):i_res{i},u_标记{IS_int}{}
结果(双d):d_res{d},u_标记{IS_double}{}
结果和运算符=(结果常量&)=默认值;
自动运算符=(int i)
{i_res=i;u_tag=IS_INT;return*this;}
自动和操作员=(双d)
{d_res=d;u_tag=IS_DOUBLE;返回*this;}
};
int main(){
std::函数cb;
cb=foo;
自动r=cb(1.0);
断言(r.u_标记==Result::IS_INT);
std::cout如果您的类没有模板(如示例中所示),则可以执行以下操作:
template <class T>
struct myStruct
{
static T (*ptrToFunction)(double);
};
模板
结构myStruct
{
静态T(*ptrToFunction)(双精度);
};
看起来您正在使用dlsym
/GetProcAddress
获取函数地址
在这种情况下,您需要至少两个调用站点来消除调用的歧义,因为CPU实际上为每个调用执行不同的操作
enum ReturnType { rtInt, rtDouble };
void SetPtrToFunction( std::string fName , enum ReturnType typeOfReturn );
struct Function {
enum ReturnType rt;
union {
std::function< int(double) > mIntFunction;
std::function< double(double) > mDoubleFunction;
} u;
} mFunction;
不介意,但理解起来有点复杂。很少有内联注释会有帮助。cb_tag
有什么用?@SauravSahu-它是标记的联合习惯用法的标记部分。您可以将此成员与联合的成员一起设置,以便以后可以知道哪个联合成员可以安全访问。使用std::function
来删除返回类型+1@SauravSahu-链接到一篇关于歧视工会的文章。@paraxod-标记是让你知道工会持有什么。记账是你的工作。没有魔法能使标记与活动成员匹配。如果不匹配,你的程序将有未定义的行为。你想如何使用此函数?更多导入打电话的人怎么知道他在期待什么?你的意思是(不是dlfun
)您可能指的是原始函数指针,而不是std::function
-I在问题中看不到任何暗示动态库调用的内容。@SteveKidd除了使用GetProcAddress之外,我还不熟悉另一种将字符串与函数相关联的机制/dlsym@kmsteve对不起,我明白你的意思。另一种选择是硬编码的if/else根据输入字符串的值设置函数指针。为什么是静态的?值得注意的是,这会使每个实例只返回一个返回类型(如果已删除静态)。当然,这可能是需要的。
template <class T>
struct myStruct
{
static T (*ptrToFunction)(double);
};
enum ReturnType { rtInt, rtDouble };
void SetPtrToFunction( std::string fName , enum ReturnType typeOfReturn );
struct Function {
enum ReturnType rt;
union {
std::function< int(double) > mIntFunction;
std::function< double(double) > mDoubleFunction;
} u;
} mFunction;
int A::doCall( double value ) {
if( mFunction.rt == rtInt ) {
int result = mFunction.mIntFunction( value );
} else if( mFunction.rt == rtDouble ) {
double result = mFunction.mDoubleFunction( value );
}
}