可以在没有模板参数的情况下使用模板化类的静态类函数吗?

时间:2012-05-16 18:27:15

标签: c++ templates

我有一个模板化的类,它包含一个不依赖于模板参数的静态函数。然而,当我使用函数时,编译器似乎强迫我指定一个类型名称。

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;'从头文件中它也不会编译。

这样做的正确方法是什么?

3 个答案:

答案 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>