gpt4 book ai didi

c++ - 派生类中的显式模板静态成员实例化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:34 24 4
gpt4 key购买 nike

我正在尝试使用静态成员实现模板类。从模板类派生的类应该被实例化,而不需要编写额外的代码。

这是我天真的(但不成功)的方法:

Singleton.h:

template <class T> class Singleton {
protected:
Singleton();
static T instance_;
}

// explicit instantiation of 'instance_' ???,
// where 'instance_' is an instance of the derived class
template <class T> T Singleton<T>::instance_;

混凝土A.h:

class ConcreteA : public Singleton<ConcreteA> {
public:
ConcreteA();
void foo();
}

main.c:

int main() {
// an instance of ConcreteA should have been created (no extra code)!!!
return 0;
}

有没有一种方法可以通过从 Singleton 派生 ConcreteA 来强制实例化 ConcreteA,而无需编写额外的实例化代码?

肮脏的解决方法是在 ConcreteA 构造函数中调用 instance_ 上的方法,例如:

ConcreteA.c

ConcrereA::ConcreteA { instance_.foo(); }

是否有更好的解决方法?

最佳答案

建立在你自己的“肮脏的把戏”之上,这在我测试的所有编译器中都有效,并且不需要派生类构造函数中的任何代码:

#include <iostream>

template <class T> class Singleton {
protected:
Singleton() { instptr_ = &instance_; }
static T instance_;
private:
static T* instptr_;
};

template<class T> T Singleton<T>::instance_;
template<class T> T* Singleton<T>::instptr_;

class ConcreteA : public Singleton<ConcreteA> {
public:
ConcreteA() { std::cout << "ConcreteA constructed.\n"; }
void foo();
};

int main() {
//Prints 'ConcreteA constructed.'.
return 0;
}

我对它的理解是获取 instance_ 的地址 odr-uses 它,迫使它存在。我必须说,我不能 100% 确定这不会在某些编译器的 future 版本中被优化掉(我在任何地方都使用 -O2 对其进行了测试)。

编辑:看起来甚至像这样编写基类构造函数

Singleton() { (void)&instance_; }

就足够了,它完全摆脱了 instptr_

关于c++ - 派生类中的显式模板静态成员实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com