C++ 带C+的逻辑函数+;模板
注意:C++11也可以接受,但C++99更可取。请不要用虚拟函数回答,请只使用模板 我想模拟的是一个典型的“a和B意味着C”的情况。我有一些C++类,还有一些描述它们属性的模板。例如:C++ 带C+的逻辑函数+;模板,c++,templates,logic,C++,Templates,Logic,注意:C++11也可以接受,但C++99更可取。请不要用虚拟函数回答,请只使用模板 我想模拟的是一个典型的“a和B意味着C”的情况。我有一些C++类,还有一些描述它们属性的模板。例如: template<typename S, typename T, typename U> class Base { MaybeTruePropertyA<S,T> a; MaybeTruePropertyB<S,T,U> b; MaybeTrueProp
template<typename S, typename T, typename U>
class Base
{
MaybeTruePropertyA<S,T> a;
MaybeTruePropertyB<S,T,U> b;
MaybeTruePropertyC<S,T,U> c;
};
模板
阶级基础
{
MaybeTruePropertyA a;
MaybeTruePropertyB;
MaybeTruePropertyC;
};
假设我继承了这样的遗产:
template<typename S, typename T, typename U>
class Inherited : public Base<S,T,U>
{
TruePropertyA<S,T> a;
TruePropertyB<S,T, U> b;
};
MaybeTruePropertyC<1, 2, 3> c;
c.doSomething();
模板
继承的类:公共基
{
真实财产a;
真实财产b;
};
然后我想神奇地将PropertyC
设置为TrueProperty
中的inheritated
。
现在,我的问题是:
MaybeTruePropertyA
是浪费内存TrueProperty a
那样表示
这里可以找到一个不太抽象的示例:这实际上并不遵循粘贴箱中的代码。它甚至没有真正遵循问题中玩具代码中的示例。但是,您所追求的似乎是基于属性模板参数的模板专门化。下面是一个您可以如何实现此目标的示例:
template <int S, int T> struct PropertyA { enum { V = false }; };
template <int S, int T, int U> struct PropertyB { enum { V = false }; };
在这里,PropertyC
表现为false
属性,除非它的两个参数都是true
。这是通过专业化实现的
template <int S, int T, int U>
struct MaybeTruePropertyC {
void doSomething () {
PropertyC<PropertyA<S, T>::V, PropertyB<S, T, U>::V>().doSomething();
}
};
您现在可以这样使用它:
template<typename S, typename T, typename U>
class Inherited : public Base<S,T,U>
{
TruePropertyA<S,T> a;
TruePropertyB<S,T, U> b;
};
MaybeTruePropertyC<1, 2, 3> c;
c.doSomething();
MaybeTruePropertyC;
c、 doSomething();
您可以按照查看运行中的代码。另一方面,可能BetruePropertyA、B、C在Base中是私有的,因此在Inherited中看不到它们。第二,我不明白它的意思是什么“想要神奇地被设置为继承中的真正财产”。但更重要的是,您不需要在继承中“隐藏”MaybeTruePropertyA,因为它已经隐藏了。Base有模板参数可以吗?我非常确定,您需要的任何东西都可以通过一些简单的特征检查来完成(例如
std::is_Base_of
),但我并不真正理解这里的确切要求。。。“您可以添加任意数量的模板。“在这附近这么说是很危险的。”-您的伪代码及其附带的描述存在一些问题,即没有PropertyC
,不能使用s
和其他参数作为模板参数。以前有人问过,但我觉得我必须坚持:你能用英语表达你的要求吗?或者可能是简单的代码表达式,没有显示Base
和Inherited
的实现?哇,这正是我一直在寻找的。第18行中的编译器首先尝试匹配PropertyC,如果其中一个模板参数为false,那么它就匹配Property,这对吗?@Johannes:本质上。有四种类型与PropertyC
模板关联。除C++的特殊性之外,所有这些处理都是相同的。正确吗?@约翰斯:是的,你可以认为<代码> V<代码>的价值是一个特性。