3

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

template <typename T>
class MyClass {
    ...
    static void function();
};

template <typename T>
void MyClass<T>::function() {
    ....
}

此功能可用作:

MyClass<int>::function();

但是'int'只是为了满足编译器。它没有任何意义,可以替换为任何其他类型,这不会增加代码的可读性。我想做一些类似的事情

MyClass<>::function();

甚至

MyClass::function();

但编译器不让我。我意识到这是因为在头文件中我已将函数明确标记为模板化,但是当我从头文件中删除“< T >”时,它也不会编译。

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

4

3 回答 3

7

类型很重要!

模板可以是专门的,因此:

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(),嘿,它甚至更短,因为没有类!

于 2012-05-16T18:34:46.833 回答
5

想象一下你有这个:

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();

于 2012-05-16T18:39:50.737 回答
2

不要将 atemplate视为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>.

于 2012-05-16T18:28:41.963 回答