仅当模板参数具有成员函数时才启用成员函数

时间:2015-10-26 13:12:28

标签: c++ templates

我见过类似的问题,已经包含解决方案,例如: 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)GT;

我的代码:

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();
    }
}

1 个答案:

答案 0 :(得分:2)

SFINAE应仅在模板的直接上下文中处理模板参数。

只需添加另一个带有默认参数的模板参数,即可将TSink置于此直接上下文中:

template<typename Sink = TSink,
         typename = decltype(&std::remove_reference_t<Sink>::get_result)(Sink)>
auto
get_result()
{
    return _sink.get_result();
}