【发布时间】: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<>() 一起工作?
附:嗯,我刚刚意识到我可以改用-> decltype(T().get_value()),效果很好。但是为什么result_of<>() 不起作用?此外,我可以在.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