我有像
这样的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解决方案。
答案 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 );