【问题标题】:Partial template specialization for template class like std::function模板类的部分模板特化,如 std::function
【发布时间】:2020-06-19 16:04:49
【问题描述】:

我想创建一个函数重载来部分专门化一个模板类。如何使这段代码工作?

template <typename T>
struct Foo;

template <typename Result, typename ... Args>
struct Foo<Result(Args...)>
{
    Result Bar()
    {
        Result t;
        return t;
    }
};

template <typename ... Args>
void Foo<void(Args...)>::Bar()
{
    // do nothing;
}

【问题讨论】:

    标签: c++ c++11 templates variadic-templates


    【解决方案1】:

    如果它只是一个单独的成员函数,如果 Result=void 应该暴露不同的行为,那么使用 tag-dispatching

    #include <type_traits>
    
    template <typename T>
    struct Foo;
    
    template <typename Result, typename... Args>
    struct Foo<Result(Args...)>
    {
        Result Bar()
        {
            return Bar(std::is_void<Result>{});
        }
    
    private:
        Result Bar(std::false_type)
        {
            Result t;
            // Do something
            return t;
        }  
    
        void Bar(std::true_type)
        {
            // Do nothing
        }
    };
    

    DEMO

    或者,部分专业化整个班级:

    template <typename... Args>
    struct Foo<void(Args...)>
    {
        void Bar()
        {
            // Do nothing
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多