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

mar*_*man 2 c++ templates

我有一个模板类,它包含一个不依赖于模板参数的静态函数.然而,当我使用该函数时,编译器似乎强迫我指定一个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>'时它也不会编译.

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

Mat*_* M. 6

这种类型非常重要!

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

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


Ker*_* SB 5

想象一下你有这个:

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