C++ c++;:按类型值列出的模板
我有一个类a,我想基于布尔值对其进行模板化。如果正确,做某些事情;如果错误,做其他事情 现在B组需要A组作为成员。在B班,我需要一些类似的东西:C++ c++;:按类型值列出的模板,c++,templates,C++,Templates,我有一个类a,我想基于布尔值对其进行模板化。如果正确,做某些事情;如果错误,做其他事情 现在B组需要A组作为成员。在B班,我需要一些类似的东西: class B { #ifdef PRODUCT1 static A<true> proxy_; #else static A<false> proxy_; #endif } B类{ #ifdef产品1 静态代理; #否则 静态代理; #恩迪夫 } 我被困在不同的点,我的示例代码如下,它给出了许多我无法理解的错误。谁能帮忙吗
class B {
#ifdef PRODUCT1
static A<true> proxy_;
#else
static A<false> proxy_;
#endif
}
B类{
#ifdef产品1
静态代理;
#否则
静态代理;
#恩迪夫
}
我被困在不同的点,我的示例代码如下,它给出了许多我无法理解的错误。谁能帮忙吗
圣殿骑士团
#define PRODUCT1
template<bool T>
class A {
public:
void init(){
if(T) {
valid_ = 1;
} else {
valid_ = 0;
}
}
int valid_;
};
class B {
public:
template<bool T>
static A<T> proxy_;
};
#定义产品1
模板
甲级{
公众:
void init(){
if(T){
有效值=1;
}否则{
有效值=0;
}
}
int有效值;
};
B类{
公众:
模板
静态代理;
};
temp.cpp
#include "templ.h"
#ifdef PRODUCT1
template<> A<bool> B::proxy_<true>;
#else
template<> A<bool> B::proxy_<false>;
#endif
main(){
B::proxy_.init();
}
#include "templ.h"
A<true> B::proxy_;
main(){
B::proxy_.init();
}
#包括“temp.h”
#ifdef产品1
模板A B::代理服务器;
#否则
模板A B::代理服务器;
#恩迪夫
main(){
B::proxy_uz.init();
}
我想你在找这个:
template<bool> struct A;
// explicit specializations for true and false
template<> struct A<true>
{ /* whatever */ };
template<> struct A<false>
{ /* whatever */ };
template<bool BParam> struct B
{
static A<BParam> ainstance;
};
// definition of the static data member
template<bool BParam>
A<BParam> B<BParam>::ainstance;
感谢这两个答案:我进一步优化了它,得到了我想要的。这是给所有人的 圣殿骑士团
template<bool T>
class A {
public:
void init(){
if(T)
valid_ = 1;
else
valid_ = 0;
}
int valid_;
};
class B {
public:
#ifdef PRODUCT1
static A<true> proxy_;
#else
static A<false> proxy_;
#endif
};
模板
甲级{
公众:
void init(){
if(T)
有效值=1;
其他的
有效值=0;
}
int有效值;
};
B类{
公众:
#ifdef产品1
静态代理;
#否则
静态代理;
#恩迪夫
};
temp.cpp
#include "templ.h"
#ifdef PRODUCT1
template<> A<bool> B::proxy_<true>;
#else
template<> A<bool> B::proxy_<false>;
#endif
main(){
B::proxy_.init();
}
#include "templ.h"
A<true> B::proxy_;
main(){
B::proxy_.init();
}
#包括“temp.h”
代理服务器;
main(){
B::proxy_uz.init();
}
1]我不想让B类成为模板。我可以这样做吗?对不起,我刚才没有提到这件事。2] 我可以将模板专门化合并到一个类中吗?@Pkp已更新,但制作B
类模板确实是更好的解决方案。多亏了你的两个答案。我不知道我们可以通过值进行专门化(我们在这里是通过true或false进行的),我认为我们可以为特定类型(比如char)编写模板专门化。你能给我指一下讨论这个问题的文档吗?@Pkp搜索“非类型模板参数”。当模板参数是一个类型(template…
)时,可以为给定的类型专门化它,比如说char
。这里有一个非类型模板参数(template
),因此您可以为该参数可以保存的值提供专门化。感谢您提供这些信息。非常有帮助!根本不需要init()
函数。在A
的构造函数中初始化有效。您还应该在代理
的定义周围添加#ifdef-#else
,或者做什么