用于重载运算符的标准C ++ 03语法如下:
操作员功能-ID :
运营商 运营商
运营商 运营商< 模板参数列表>
第一个是我们通常使用的普通运算符重载语法,例如
Myclass operator + (Myclass s) {...}
但第二种选择意味着什么呢?特别是,在什么情况下我们使用 template-argument-list ?在快速浏览一下C ++ 11之后,我发现第二种形式已经从标准中删除了。它的初衷是什么?
编辑:在使用VC ++ 2010测试之后,下面是使用上述语法的一种方法,虽然它对我没有多大意义:class K {
public:
int a;
template <int B>
int operator + (int b) {
return a+b+B;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
K k;
k.a=1;
int s;
s=k.operator+<115>(2);
printf("%d\n",s);
return 0;
}
output:118
答案 0 :(得分:5)
允许对操作符功能模板进行特化的语法规则仍然存在于C ++ 11中,它只是在不同的地方。
[temp.names] / 1(C ++ 03):
模板特化(14.7)可以通过template-id:
来引用模板id:
template-name < template-argument-listopt>
模板名称:
identifier
模板参数列表:
template-argument template-argument-list , template-argument
模板的参数:
assignment-expression type-id id-expression
[temp.names] / 1(C ++ 11):
模板特化(14.7)可以通过template-id:
来引用简单模板id:
template-name < template-argument-listopt>
模板id:
simple-template-id operator-function-id < template-argument-listopt> <- HERE literal-operator-id < template-argument-listopt>
模板名称:
identifer
模板参数列表:
template-argument ...opt template-argument-list , template-argument ...opt
模板的参数:
constant-expression type-id id-expression
这可能是因为语法规则 operator-function-id 在上下文中被引用,其中该模板参数列表没有意义,因此他们将规则移到更合理的地方&lt; /猜想&GT;
以下是此规则的实例示例:
struct foo{
template <typename T>
void operator() (T t) { std::cout << t; }
};
template <>
void foo::operator()<double> (double) {
std::cout << "It's a double!";
}
请注意operator()
T
为double
时的foo f;
f(0);
f(0.0);
专精。如果您运行此代码:
0
然后会为第一个电话打印It's a double!
,第二个电话会打印`/ Declare a variable that references the type. /
DECLARE @LocationTVP AS LocationTableType;
/ Add data to the table variable. /
INSERT INTO @LocationTVP (LocationName, CostRate)
SELECT Name, 0.00
FROM AdventureWorks2012.Person.StateProvince;
/ Pass the table variable data to a stored procedure. /
EXEC usp_InsertProductionLocation @LocationTVP;`
。