你能用语句专门化吗?

Can you specialise using statements?

本文关键字:专门化 语句      更新时间:2023-10-16

如果我想让某种类型在其模板参数上特殊化,我通常使用struct:

template <bool value>
struct IsTrue;
template <>
struct IsTrue<true> : std::true_type {};
template <>
struct IsTrue<false> : std::false_type {};

从继承中获得其唯一功能的空结构体与using语句并没有真正的不同,所以我想知道,using语句存在模板专门化之类的东西吗?下面的伪代码:

template <bool value>
using IsTrue;
template <>
using IsTrue<true> = std::true_type;
template <>
using IsTrue<false> = std::false_type;

这样的事情可能吗?会叫什么名字呢?

不可以,别名模板不能部分或显式特化。

早期的设计确实允许专门化,但是结果的语义相当…奇怪,至少从今天的角度来看。例如,在这样的设计中,下面的程序将声明两个不同的函数模板:

template<class, class> class Meow {};
template<class T> using MeowInt = Meow<int, T>;
template<class> void f(Meow<int, T>);
template<class> void f(MeowInt<T>);

和此调用将无法编译,因为您将无法推断模板实参:

template<class T> using Purr = T;
template<class T> void f(Purr<T>);
f(42);