关于 adanve 的注释: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;
MaybeTruePropertyC<S,T,U> c;
};
假设我像这样继承:
template<typename S, typename T, typename U>
class Inherited : public Base<S,T,U>
{
TruePropertyA<S,T> a;
TruePropertyB<S,T, U> b;
};
然后我想要神奇地被设置PropertyC
为TrueProperty
在Inherited
。
现在,这是我的问题:
- 我不知道如何神奇地做到这一点。
- 另外,我认为隐藏是浪费内存
MaybeTruePropertyA
在继承中。
有人有一个解决方案,如何使用上面的属性来执行一些“A 和 B 暗示 C”?您可以更改一些内容,但属性仍应表示为 TrueProperty<S,T> a
.
可以在这里找到一个不太抽象的示例:http://pastebin.com/M209CJp4
最佳答案
这并不真正遵循粘贴箱中的代码。它甚至没有真正遵循问题中玩具代码中的示例。但是,您似乎追求的是基于属性模板参数的模板特化。以下是如何实现此目的的示例:
template <int S, int T> struct PropertyA { enum { V = false }; };
template <int S, int T, int U> struct PropertyB { enum { V = false }; };
这个想法是,PropertyA
和 PropertyB
默认情况下是 false
属性。它们通过专门化变得真实
,稍后将进行说明。
template <bool A, bool B>
struct PropertyC {
void doSomething () { std::cout << "False" << std::endl; }
};
template <> struct PropertyC<true, true> {
void doSomething () { std::cout << "True" << std::endl; }
};
此处,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();
}
};
现在,MaybeTruePropertyC
由 PropertyA
和 PropertyB
使用的值进行参数化,并且它们的值被馈送到 PropertyC
> 获得所需的行为。
因此,要使用这些类,您需要为 PropertyA
和 PropertyB
定义一些专门化。
template <> struct PropertyA<1, 2> { enum { V = true }; };
template <> struct PropertyB<1, 2, 3> { enum { V = true }; };
现在您可以像这样使用它:
MaybeTruePropertyC<1, 2, 3> c;
c.doSomething();
您可以关注link查看正在运行的代码。
关于c++ - 使用 C++ 模板的逻辑函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481252/