我有一个模板类,它包含一个不依赖于模板参数的静态函数.然而,当我使用该函数时,编译器似乎强迫我指定一个typename.
template <typename T>
class MyClass {
...
static void function();
};
template <typename T>
void MyClass<T>::function() {
....
}
Run Code Online (Sandbox Code Playgroud)
此功能可用作:
MyClass<int>::function();
Run Code Online (Sandbox Code Playgroud)
但'int'就是满足编译器的需要.它没有任何意义,可以被任何其他类型替换,这不会增加代码的可读性.我想做点什么
MyClass<>::function();
Run Code Online (Sandbox Code Playgroud)
甚至
MyClass::function();
Run Code Online (Sandbox Code Playgroud)
但编译器不允许我.我意识到这是因为在头文件中我明确地将该函数标记为模板化,但是当我从头文件中删除'<T>'时它也不会编译.
这样做的正确方法是什么?
这种类型非常重要!
模板可以是专用的,因此:
template <typename T>
class MyClass {
public:
static void function() { std::cout << "Hello, World!\n"; }
};
template <>
class MyClass<City> {
public:
static void function() { launchRockets(); }
};
Run Code Online (Sandbox Code Playgroud)
是一个可行的计划.
如果你再写MyClass::function(),它应该消灭巴格达还是打印友好的信息?
当然,如果没有理由对这个功能做其他任何印刷,那么它或许应该是一个函数自身:
void function() { std::cout << "Hello, World!\n"; }
Run Code Online (Sandbox Code Playgroud)
简单地调用function()它,嘿,它甚至更短,因为没有课!
想象一下你有这个:
template <typename T> struct Foo
{
static void boom()
{
static int n = 0;
std::cout << ++n << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
现在想象一下,如果您说什么会发生什么Foo<int>::boom(); Foo<int>::boom();,然后将其与并非全部等效的结果进行比较Foo<int>::boom(); Foo<char>::boom();。