有条件地提供 using 声明

问题描述

假设我有一个带有模板参数 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&;
};