命名模板静态方法的特定实例的正确语法是什么?
以下所有attempts似乎都是错误的:
struct S
{
template<int x> static int f() { return x; }
using g1 = f<1>;
template using g2 = f<1>;
template<> using g3 = f<1>;
};
答案 0 :(得分:0)
C ++不喜欢具有模板方法的本地结构(参见here)
你需要解除它。你还想为你的typedef使用decltype吗? e.g。
table-layout: fixed
那些只会给你类型。可能最好直接打电话给他们,例如的s :: F&℃,GT;等
答案 1 :(得分:0)
struct S {
template<int x> static int f() { return x; }
static int g1() { return f<1>(); }
};
请注意,此处g1
不是f<1>
- &S::f<1> != &S::g1
。但称它具有相同的效果。 (对于某些链接器,这可能不是真的; msvc链接器,或者积极设置的金链接器)
答案 2 :(得分:0)
using
定义了一个别名,它没有专门化任何东西。 using
定义了类,类型等的别名......别名和特化是两个完全不同的东西。
f()
不是一个班级。这是一种方法。类,各种类型以及此类事物可以使用using
或typedef
别名。但不是功能或方法。
如果要专门化类方法,请在类外定义方法的特化:
template<>
int S::f<1>()
{
return 0; // Or whatever your specialization function needs to do.
}
如果你想要一个函数的别名,这基本上就是一个包装器:
int f1()
{
return f<1>();
}
因此,调用f1()
现在调用专门的方法。
如果你想同时专注和&#34;别名&#34;静态类方法,有一个额外的扭曲。您无法在类中定义内联包装器。这是因为尚未宣布专业化。你必须声明包装器;然后在定义专业化后定义它:
#include <iostream>
struct S
{
template<int x> static int f() { return x; }
static int f1();
};
template<>
int S::f<1>()
{
return 0;
}
inline int S::f1()
{
return f<1>();
}
int main()
{
std::cout << S::f<4>() << std::endl;
std::cout << S::f<1>() << std::endl;
}
如果这实际上进入头文件,则需要 inline
,以避免链接时出现重复的符号。如果整个事情进入单个翻译单元,您可以放弃inline
。
答案 3 :(得分:0)
这works:
#include <iostream>
struct S {
template<int x> static int f() { return x; }
};
auto& g = S::f<1>;
int main() {
std::cout << g() << std::endl;
return 0;
}
通过使用auto&
,我们命名特定的模板函数实例化。