2015-12-08 71 views
0

我想将静态函数添加到无需先传递模板参数即可访问的模板类中。那可能吗?模板类中的静态非模板方法

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

我想避免移动eggs()foo命名空间或为它创建一个新的命名空间(如foo::bar_::eggs(),啊)。

回答

4

不。这不是模板类的工作方式。你想要做的事情在C++中是不可能的。

+1

不,你不能这样做。但是你总是可以使用typedefs缩短名称。 typedef foo :: bar Tbar; Tbar :: eggs(); –

1

请记住,foo::bar没有命名任何类型,而只是一个可用于创建其他类型的模板。

除了使用typedefs /类型别名(通过using),您可以为模板创建一个非模板化的基类,然后将静态成员放在那里。如果您使用公共继承,则更改任何模板化类中的静态成员都会在其中全部更改。

0

您可以使模板参数为可选,您可以定义专用模板。就像这样:

namespace foo { 

template <typename T = void> class bar { 
public: 
    static void eggs() { cout << "First there was the egg" << endl; } 
}; 

template <> class bar<void> { 
public: 
    static void eggs() { 
    cout << "Then there was the chicken... or was it?" << endl; 
    } 
}; 
} 

auto main() -> int { 
    foo::bar<int>::eggs(); // egg 
    foo::bar<>::eggs(); // chicken 

    return 0; 
} 
1

与您的代码尝试后:

我想一个静态函数添加到模板类,而没有先通过模板参数访问 。那可能吗?

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

我想避免移动蛋()给foo的命名空间或创建 一个新的命名空间为它(如富::酒吧_ ::鸡蛋(),唉)。

我来这的

foo::bar<some_t>::eggs(); // works while 
foo::bar::eggs(); // doesn't 

首先是由于这样的事实,使用模板的时候,班级内的任何必须是相对于特定对象的结论,甚至如果你不想要这个功能。我甚至尝试过使用函数指针,并试图将它们保存到模板类中,但没有用,我甚至无法编译。在这种情况下,我看不到很多选择。有人可能会知道其他一些技巧,但不是从我所能看到的。