用于命名模板静态类方法的特定实例的语法

时间:2017-01-16 16:36:08

标签: c++ c++11 templates using

命名模板静态方法的特定实例的正确语法是什么?

以下所有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>;
};

4 个答案:

答案 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()不是一个班级。这是一种方法。类,各种类型以及此类事物可以使用usingtypedef别名。但不是功能或方法。

如果要专门化类方法,请在类外定义方法的特化:

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&,我们命名特定的模板函数实例化。