我想避免在调用模板成员函数时指定返回类型。'decltype' 关键字与 'auto' 结合可以实现这一点,但不幸的是,我们没有针对我们需要支持的所有平台的 C++11 编译器。使用类型限定模板方法应用程序也可以,但需要调用者...使用类型限定模板方法。
以下是可能的,有一些模板魔法吗?boost 1.48 在这里提供任何帮助吗?
我们的实际代码是利用 boost::thread、boost::packaged_task 和 boost::unique_future,但这里是一个人为的例子:
#include <functional>
#ifdef WONT_COMPILE
struct WrapNoDecltype
{
WrapNoDecltype() {}
template<typename F>
std::result_of<F>::type // warning: 'std::result_of<_Fty>::type' : dependent name is not a type
operator()(const F& f)
{
setup();
std::result_of<F>::type result = f();
teardown();
return result;
}
void setup() { }
void teardown() { }
};
#endif
struct Wrap
{
Wrap() {}
template<typename F>
auto operator()(const F& f) -> decltype(f())
{
setup();
typename std::result_of<F()>::type result = f();
teardown();
return result;
}
void setup() { }
void teardown() { }
};
struct WrapWithReturnType
{
WrapWithReturnType() {}
template<typename RetType>
RetType
apply(const std::function<RetType(void)>& f)
{
setup();
RetType result = f();
teardown();
return result;
}
void setup() { }
void teardown() { }
};
int answer()
{
return 42;
}
int main()
{
Wrap w;
WrapWithReturnType wwr;
#ifdef WONT_COMPILE
WrapNoDecltype wna;
#endif
int i = w(answer);
int j = wwr.apply<int>(answer);
#ifdef WONT_COMPILE
int k = wna(answer);
#endif
return 0;
}