我有几个A
类似的方法,比如get_value()
,它返回不同类型的值。还有一个类B
,它使用方法value()
返回一个值。例如:
struct A_like1 {
int get_value() const { return 10; }
};
struct A_like2 {
char get_value() const { return 'a'; }
};
struct B
{
float value() const { return 2.5; }
};
现在,我需要一个函数来检索这些类的值。我有一个功能:
template<typename T>
auto get_value(const T & t) -> result_of<decltype(&T::get_value)(T)>::type
{
return t.get_value();
}
它在VS2010上给出了一些编译错误,从以下开始:
Error 1 error C2061: syntax error : identifier 'type' c:\_data\work\vmxi\c++\vox\vox\template_specialization.h 51
对于B
我有一个过载,这很好。问题是,如何使get_value()
与result_of<>()
一起使用?
P.S。嗯,我刚刚意识到我可以使用-> decltype(T().get_value())
来代替,这很好用。但为什么result_of<>()
不起作用?此外,我能够在.cpp
文件中声明一个变量:
result_of<decltype(&A_like1::get_value)(A_like1)>::type i=0;
答案 0 :(得分:1)
关键字typename
可用于声明依赖名称(如std::result_of<T>::type
)是一种类型。否则,我相信它假设std::result_of<T>::type
是数据成员。在C ++ 14中,有几种类型特征获得了using
别名,其中包含typename
关键字。这些别名的名称始终与特征相同,后缀为_t
。
尝试:
typename result_of<decltype(&T::get_value)(T)>::type
或者,使用C ++ 14:
result_of_t<decltype(&T::get_value)(T)>