问题描述
假设我有一个带有模板参数 foo
的类 T
,我想为与 T
对应的引用和常量引用类型提供一个 using 声明:
template<typename T>
struct foo
{
using reference = T&;
using const_reference = T const&;
};
有没有办法仅在 T
不是 void
时使用 declarations 来“启用”这些而不专门化整个类 foo
?
解决方法
您可以从具有 void
特化的基类继承:
template<typename T>
struct typedefs {
using reference = T&;
using const_reference = T const&;
};
template<>
struct typedefs<void> {};
template<typename T>
struct foo : typedefs<T>
{};
,
如果你不想让你的程序用 foo<void>
编译并且不介意丑陋的 SFINAE,那么这里有一个没有专业化的丑陋解决方案:
template< typename T,typename = std::enable_if_t<!std::is_same_v<void,T>>>
struct foo
{
using reference = T&;
using const_reference = T const&;
};