我看到了类似的问题,这些问题已经包含解决方案,例如以下问题:
Is it possible to write a C++ template to check for a function's existence?
但是我想知道为什么我的解决方案只能在VC2015上运行,而不能在GCC5.1上运行。
GCC给我以下错误:
错误:“ get_result”不是“ std :: remove_reference_t >>> {aka main()::}”的成员
templatedecltype(&std :: remove_reference_t :: get_result)(TSink)>
我的代码:
template <typename TSink>
struct Consume{
...
TSink& _sink;
Consumer(TSink& sink) : _sink(sink){};
...
template<typename = decltype(&std::remove_reference_t<TSink>::get_result)(TSink)>
auto
get_result()
{
return _sink.get_result();
}
}
最佳答案
SFINAE应该仅在模板的直接上下文中处理模板参数。
您可以通过直接添加另一个带有默认参数的模板参数来将TSink
带入此立即上下文中:
template<typename Sink = TSink,
typename = decltype(&std::remove_reference_t<Sink>::get_result)(Sink)>
auto
get_result()
{
return _sink.get_result();
}