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 );
      }
  }