如何创建与给定函数具有相同类型的变量?

时间:2011-05-11 09:46:04

标签: c++ templates

我有像

这样的C ++函数
int f( const std::string &s, double d );

现在我想创建一个包含指向f的指针的变量。这个变量应该有正确的类型(int (*)( const std::string &, double ) - 但是我不想明确地写出那个类型。我想从f中推断它,这样我就不会重复类型签名了最后,我希望能够写下以下内容:

TypeOf<f>::Result x = f;

为实现这一目标,我尝试做了类似的事情:

// Never implemented, only used to deduce the return type into something which can be typedef'ed
template <typename T> T deduceType( T fn ); 

template <typename T>
struct TypeOf {
    typedef T Result;
};

// ...
TypeOf<deduceType(f)>::Result x = f;

我希望也许函数的返回类型(在这种情况下为deduceType)可以用作模板参数但是唉 - 似乎你不能这样做。

有人知道怎么做吗?我正在寻找一个C ++ 03解决方案。

4 个答案:

答案 0 :(得分:10)

C ++ 0x添加了decltype,它可以满足您的需求(如果我理解正确的话)。

另一个选项可能是Boost::Typeof,它旨在提供相同的功能,直到所有编译器都支持decltype。

答案 1 :(得分:0)

你可以像这样声明你的变量:

int (*FuncPtr)(const std::string& s, double d);

这里FuncPtr是你的变量。如果FuncPtr不为NULL,您可以像int result = FuncPtr(str, d);一样使用它。为此你可以这样做:

int result = 0;
if (FuncPtr)
{
   result = FuncPtr(str, doubleValue);
}

答案 2 :(得分:0)

如果您坚持使用当前标准,请使用BOOST_TYPEOF - ala:

#include <iostream>
#include <boost/typeof/typeof.hpp>

struct foo
{
  int f( const std::string &s, double d ){ std::cout << "foo::f()" << std::endl; return 0;}
};

int main(void)
{
  BOOST_TYPEOF(&foo::f) x = &foo::f;

  foo f1;

  std::string s("he");

  (f1.*x)(s, 0.); 
}

答案 3 :(得分:0)

更好地使用typedef。您可以重复typedef名称而不是整个函数签名。

在大多数情况下,即使你能做到,也不是一个好主意。

typedef int (*FuncType)( const std::string &s, double d );