你能专门使用语句吗?

5

如果我想让某种类型专门针对其模板参数进行特化,通常会使用一个结构体:

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;

这种情况可能吗?它应该被称为什么?


我不知道是否可能,但如果使用像using语句那样的方式,就像typedef一样创建了一个类型别名 - Some programmer dude
请查看类型别名 http://en.cppreference.com/w/cpp/language/type_alias - Jean-Baptiste Yunès
3
不,别名模板不能被部分或显式地特化。这是一件好事,因为否则模板参数推导无法透过它进行推导。 - T.C.
@T.C. 谢谢。请随意发布作为答案。我认为这可能是一个不太可能的尝试... - quant
1个回答

4

不,别名模板不能被部分或显式地专门化。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接