C++11 如何用整型本身专门化整型的类模板?

C++11 如何用整型本身专门化整型的类模板?,c++11,templates,template-specialization,C++11,Templates,Template Specialization,我有一个类模板X,如下所示: 模板 X类{ 公众: X(T&T):T{T}{} 私人: T&T; }; 有没有一种方法专门化T=int的表达式,使X(i)的整数i只“返回”编译时 换句话说,我希望对double和int使用相同的语法(分别是X(d)和X(I)),但前者调用一个构造函数来初始化引用,如上面代码所示,而后者则忽略“语法糖”和“返回”整型i不做任何操作。您可以分别为int和double提供模板专门化,并使用转换运算符。大概是这样的: // the same applies for d

我有一个类模板
X
,如下所示:

模板
X类{
公众:
X(T&T):T{T}{}
私人:
T&T;
};
有没有一种方法专门化
T=int
的表达式,使
X(i)
的整数
i
只“返回”编译时


换句话说,我希望对
double
int
使用相同的语法(分别是
X(d)
X(I)
),但前者调用一个构造函数来初始化引用,如上面代码所示,而后者则忽略“语法糖”和“返回”整型
i
不做任何操作。

您可以分别为
int
double
提供模板专门化,并使用转换运算符。大概是这样的:

// the same applies for double
template<>
class X<int> {
 public:
   constexpr X(int t) : t_ {t} {}

   constexpr operator int() const { return t; }

 private:
   int t_;
};
//这同样适用于double
模板
X类{
公众:
constexpr X(int t):t{t}{
constexpr运算符int()const{return t;}
私人:
int t_;
};
这将允许类似于以下内容的工作(如果我误解了您的问题,请纠正我):

constexpr int n=X(20);//n==20

所以你想要像
intn=X(i)是否有效?根据规范“[temp]模板定义一系列类或函数或一系列类型的别名”和“[temp.decls]3。由于别名声明无法声明模板id,因此无法部分或显式专门化别名模板”。因此,您所要求的内容没有专门化。然而,DeiDei指出了另一种方法。亲爱的@DeiDei,你正确理解了我的问题。如果我们将
n
定义为
constexpr auto n=X(20)
,那么它会是什么类型。它是
X
,对吗?是的,没错。仅当需要
int
时,才会将其转换为
int
。但我相信这是最接近你想要的。我肯定会接受你的答案。谢谢你这么及时的回复。
constexpr int n = X<int>(20); // n == 20