gpt4 book ai didi

c++ - 我可以有模板实例化副作用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:30 27 4
gpt4 key购买 nike

那么,让我们从执行我想要的操作的代码开始,但我想教它一个新技巧(如果可能的话)。

#include <string>
#include <iostream>

class A {}; class B {}; class C {}; class D {};

template<typename T> struct traits { };
template<> struct traits<A> { static std::string code() {return "class A";}};
template<> struct traits<B> { static std::string code() {return "class B";}};
template<> struct traits<C> { static std::string code() {return "class C";}};
template<> struct traits<D> { static std::string code() {return "class D";}};

std::string RegisterClass(const std::string & c){
std::cout << "Registering " << c << '\n';
return c;
}

template<typename T> void printMe() {
static std::string t = RegisterClass(traits<T>::code());
std::cout << "Printing " << traits<T>::code() << '\n';
}

int main(void)
{
printMe<B>();
printMe<B>();
printMe<C>();
return 0;
}

它的输出正如人们所期望的那样——“注册”只发生一次,并且只针对模板实例化的那些类型:

Registering class B
Printing class B
Printing class B
Registering class C
Printing class C

我想要的是只有在第一次调用printMe 函数之前用于“注册”自己的类。所以输出看起来像这样:

Registering class B
Registering class C
Printing class B
Printing class B
Printing class C

从表面上看,这似乎是可能的。编译器“知道”哪些类型用于实例化。如果我能够将该信息存储在一些全局或静态的东西中,那么我只需在 main() 的开头处理它。

但到目前为止,我所有试图颠覆编译器实际执行它的尝试都失败了。这让我怀疑这是故意的。所以'我可以有模板实例化副作用吗? ’他问道,期待着‘不’的回答?

编辑: 对不起,我真的没能用那句话表达清楚。在上面的示例中,我不需要为 A、B、C 和 D 注册——我只需要为 B 和 C 注册,我希望编译器计算不知何故他自己解决了这个问题。

最佳答案

是的,使用在命名空间范围内实例化的静态成员变量。例如:

template<typename T>
struct RegisterClass
{
static RegisterClass instance;
RegisterClass()
{
std::cout << "Registering " << traits<T>::code() << '\n';
}
static RegisterClass& doRegister() { return instance; }
};
template<typename T>
RegisterClass<T> RegisterClass<T>::instance;

template<typename T> void printMe() {
RegisterClass<T>::doRegister();
std::cout << "Printing " << traits<T>::code() << '\n';
}

Working example .

使用静态成员函数 doRegister 的唯一原因是避免来自未使用变量的警告。

另见 How does the scheme below garantees there'll be just one definition for the objects cin, cout, ...?对于与全局对象和初始化顺序相关的一些问题。

关于c++ - 我可以有模板实例化副作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28052989/

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