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>::member
与 Test<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
}
我有这个代码:
#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>::member
与 Test<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
}