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

标签 c++ templates

我见过类似的问题,已经包含解决方案,例如这个: Is it possible to write a C++ template to check for a function's existence?

但是我想知道为什么我的解决方案适用于 VC2015 而不是适用于 GCC5.1。 GCC 给我以下错误:

error: ‘get_result’ is not a member of ‘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();
}

关于c++ - 仅当模板参数具有成员函数时才启用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346658/

相关文章:

python - 在 python 中调用 C 库?

c++ - 为什么函数指针不被通用引用捕获?

c++ - 多模板化接口(interface)继承名称隐藏

c++ - 如何在 C++ 中使用单个模板参数传递两个 lambda 函数

wpf - WPF自定义控件模板-相对字体大小

c++ - 我们应该在子进程中使用退出还是返回

c++ - 指向成员的指针对于托管类无效

c++ - 在 Windows 10 中运行 gcc 插件时出现问题

c++ - 返回指向对象的指针(C++ 模板)错误

C++ 示例观察者模板类错误