2

关于 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;
};

然后我想神奇地设置PropertyCTruePropertyin Inherited。现在,这是我的问题:

  1. 我不知道如何神奇地做到这一点。
  2. 另外,我认为隐藏MaybeTruePropertyA在继承中是浪费内存。

有没有人解决我如何用上面的属性做一些“A和B暗示C”?您可能会更改一些内容,但属性仍应表示为TrueProperty<S,T> a.

一个不太抽象的例子可以在这里找到:http: //pastebin.com/M209CJp4

4

1 回答 1

2

这并不真正遵循粘贴箱中的代码。它甚至没有真正遵循您问题中玩具代码中的示例。但是,您所追求的似乎是基于属性模板参数的模板专业化。以下是您如何完成此操作的示例:

template <int S, int T> struct PropertyA { enum { V = false }; };
template <int S, int T, int U> struct PropertyB { enum { V = false }; };

这个想法是默认情况PropertyAPropertyBfalse属性。它们是true通过专业化制作的,稍后会说明。

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();
    }
};

现在,MaybeTruePropertyCPropertyA和使用的值参数化PropertyB,并且它们的值被馈送到PropertyC以获得所需的行为。

因此,要使用这些类,您需要为 和 定义一些特PropertyAPropertyB

template <> struct PropertyA<1, 2> { enum { V = true }; };
template <> struct PropertyB<1, 2, 3> { enum { V = true }; };

你现在可以像这样使用它:

MaybeTruePropertyC<1, 2, 3> c;
c.doSomething();

您可以点击链接查看运行中的代码。

于 2012-09-18T21:09:08.383 回答