我有一个模板化的类,它包含一个不依赖于模板参数的静态函数。然而,当我使用函数时,编译器似乎强迫我指定一个类型名称。
template <typename T>
class MyClass {
...
static void function();
};
template <typename T>
void MyClass<T>::function() {
....
}
此功能可用作:
MyClass<int>::function();
但'int'就是满足编译器的目的。它没有任何意义,可以被任何其他类型替换,这不会增加代码的可读性。我想做点像
MyClass<>::function();
甚至
MyClass::function();
但编译器不允许我。我意识到这是因为在头文件中我明确地将该函数标记为模板化,但是当我删除'&lt; T&gt;'从头文件中它也不会编译。
这样做的正确方法是什么?
答案 0 :(得分:6)
类型非常重要!
模板可以专用,因此:
template <typename T>
class MyClass {
public:
static void function() { std::cout << "Hello, World!\n"; }
};
template <>
class MyClass<City> {
public:
static void function() { launchRockets(); }
};
是一个可行的计划。
如果你然后写MyClass::function()
,它应该消灭巴格达还是打印一条友好的信息?
当然,如果这个函数没有理由做任何打印的事情,那么它应该是一个自己的函数:
void function() { std::cout << "Hello, World!\n"; }
由function()
简单地调用,嘿,因为没有课,它甚至更短!
答案 1 :(得分:4)
想象一下你有这个:
template <typename T> struct Foo
{
static void boom()
{
static int n = 0;
std::cout << ++n << std::endl;
}
};
现在想象一下,如果你说Foo<int>::boom(); Foo<int>::boom();
会发生什么,并将其与未与之等效的Foo<int>::boom(); Foo<char>::boom();
进行比较。
答案 2 :(得分:2)
不要将template
视为class
。它只是构建类的骨架。
MyClass::function()
没有任何意义,因为MyClass
不是实际的类,除非你把它专门化。
MyClass<int>::function();
和MyClass<char>::function();
可能不依赖于模板参数,它们的行为可能相同,但它们的功能不同。
让我们来看看二进制文件:
MyClass<int>::function();
00D617CE call MyClass<int>::function (0D611C2h)
MyClass<char>::function();
00D617D3 call MyClass<char>::function (0D611C7h)
为此,我为function
提供了一个空的定义,因此它绝对不依赖于模板参数。如您所见,这两个功能是不同的。
那是因为编译器生成了两个类 - MyClass<int>
和MyClass<char>
。