类成员函数的返回值类型

时间:2017-04-13 17:16:27

标签: c++ templates member-functions

我有几个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;

1 个答案:

答案 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)>