模板 class 的部分模板特化,如 std::function

Partial template specialization for template class like std::function

我想创建一个函数重载以部分特化模板 class。如何使此代码工作?

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

如果 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

或者,部分专业化整个 class:

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