我想向一个模板类添加一个静态函数,该模板类可以在不先传递模板参数的情况下访问。这可能吗?
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()
,ugh)。
答案 0 :(得分:4)
没有。这不是模板类的工作方式。你不想在C ++中做什么。
答案 1 :(得分:1)
请记住,foo::bar
并未命名任何类型,而只是一个可用于创建其他类型的模板。
除了使用typedef / type别名(通过using
)之外,您可以为模板创建一个非模板化的基类,然后将静态成员放在那里。如果使用公共继承,则更改任何模板化类中的静态成员将在所有模板中更改。
答案 2 :(得分:1)
在尝试使用您的代码后:
我想将静态函数添加到可访问的模板类中 没有先传递模板参数。这可能吗?
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(),ugh)。
我得出结论,
的第一个例子foo::bar<some_t>::eggs(); // works while
foo::bar::eggs(); // doesn't
由于使用模板时,类中的任何内容都必须与特定对象相关,即使您不希望使用该函数。我甚至尝试使用函数指针并尝试将它们保存到模板类中而且没有用,我甚至无法编译。在这种情况下,我没有看到很多选项。也许有人可能知道的其他技巧,但不是我能看到的。
答案 3 :(得分: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;
}