C++:如何在没有模板参数的情况下访问模板化 class 的静态成员

C++: How to acces static member of templated class without template arguments

我有这个代码:

#include <iostream>

template <typename T>
class Test {
public:

    // Some code...

    static int member;
};

int main()
{
    std::cout << Test::member;
}

这当然行不通,因为倒数第二行缺少 Test.
的模板参数 但由于 member 不依赖于 T,我想在不提供模板参数的情况下使其可访问。

有什么办法吗?

您可以给 Test 模板参数的默认值,例如

template <typename T = void>
class Test {

然后您将像

一样访问该成员
std::cout << Test<>::member;

但你无法彻底摆脱 <>

没有一个,而是很多名为member的静态变量。 Test::member 指的是哪一个?没有意义,所以不允许。

Test<int>::member = 42;
Test<short>::member = 13;

std::cout << Test::member << '\n';  // what should this print?

如果您在 class 模板 Test 中声明静态成员,则每个特化都有一个单独的静态成员副本(Test 模板生成的具体类型)。也就是说,Test<int>::memberTest<char>::member 等是不同的对象。这就是为什么您需要指定您的意思。

为了确保在所有 Test 特化之间只共享一个 member 副本,您可以将 member 移动到非模板基础 class 中:

struct TestBase {
    static int member;
}

template <typename T>
class Test : public TestBase {
    // ...
};

int main() {
    // do something with TestBase::member
}