具有唯一静态成员的C++模板
C++ Templates with unique static members
模板类的每个实例都复制了所有静态成员。如果我想要一个静态成员对所有实例只存在一次,我该怎么办?是否在类模板之外使用普通静态字段?可以工作,但似乎不合法,因为没有更多的关联到模板类。有没有一种方法可以将这种唯一的静态成员与模板类关联起来?
否;每个模板类都是一个完全独立的对象。
您可以使用静态成员创建一个公共祖先类:
class Parent
{
public:
static int commonStatic;
};
template <typename T>
class MyTempl : public Parent
{
static int nonSharedStatic;
};
模板类的每个实例都复制了所有静态成员。
没有。每个专业化都有不同的静态特性,但不同的专业化是不同的类。毫无疑问,vector<int>
和vector<char>
是完全分离的。把它想象成写IntVector
和CharVector
。
编辑:不要对此使用继承。仅仅为了共享静态成员而引入基类肯定是错误的做法。
如果你想在不同的类之间共享东西,就像你通常做的那样。在第三个类中封装一些静态,就这样了。
为模板类定义一些基类。在这个基类中包括所有常见成员:
class ExampleBase {
public:
static int foo;
};
int ExampleBase::foo = 0;
template <class A>
class Example : private ExampleBase {
public:
static void setFoo(int f) { foo = f; }
static int getFoo() { return foo; }
};
则每个示例实例都具有公共静态成员ExampleBase::foo
:
int main() {
Example<int>::setFoo(7);
assert(Example<float>::getFoo() == 7);
};
将全局变量放在某个位置。
类似这样的东西:
#include <iostream>
// header.hpp
extern int someValue;
template< typename T >
struct A
{
int foo() const
{
return someValue;
}
};
// source.cpp
int someValue = 5;
int main()
{
std::cout << A< float >().foo() << std::endl;
std::cout << A< int >().foo() << std::endl;
}
是否在类模板之外使用普通静态字段?
确切地说;只需将其放入模板声明之外的函数中即可。
如果真的想在这种情况下限制访问,你可以使用这样的东西:
class t_shared {
static int& Shared() {
static int s(0);
return s;
}
public:
template < typename T >
class t_template {
public:
void f() {
std::cout << ++Shared() << std::endl;
}
};
};
int main(int argc, const char* argv[]) {
t_shared::t_template<int>().f();
return 0;
}
类模板在静态成员方面实际上与普通类有点不同。即使每个翻译单元都包含foo.hpp
,以下内容也非常好:
foo.hpp:
template <typename T> struct TmplFoo
{
static double d;
};
struct OrdFoo
{
static double e;
}
foo.cpp:
#include "foo.hpp"
double OrdFoo::e = -1.5;
请注意,我们从不需要单独定义TmplFoo<T>::d
。链接器知道如何计算对TmplFoo<T>::d
的所有本地引用(对于给定的T
)都引用同一个对象。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数