【问题标题】: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
}
};