【问题标题】:Return value type for class member function类成员函数的返回值类型
【发布时间】:2017-04-13 17:16:26
【问题描述】:

我有几个 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&lt;&gt;() 一起工作?

附:嗯,我刚刚意识到我可以改用-&gt; decltype(T().get_value()),效果很好。但是为什么result_of&lt;&gt;() 不起作用?此外,我可以在.cpp 文件中声明一个变量:

result_of<decltype(&A_like1::get_value)(A_like1)>::type i=0;

【问题讨论】:

  • 您使用的是什么版本的 C++?如果您有 C++14,则根本不需要尾随返回类型,只需使用 auto
  • @NathanOliver 我假设他使用了两个同名的模板化函数,一个用于A-like 类,一个用于B-like 类。然后你需要尾随返回类型来触发 SFINAE。
  • @Corristo 啊,是的。我错过了。谢谢。

标签: c++ templates member-functions


【解决方案1】:

关键字typename 可用于声明依赖名称(如std::result_of&lt;T&gt;::type)是一种类型。否则,我相信它假定std::result_of&lt;T&gt;::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)>

【讨论】:

  • 这多么容易!非常感谢)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多