c++ - 使用 C++ 模板的逻辑函数

标签 c++ templates logic

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

然后我想要神奇地被设置PropertyCTruePropertyInherited 。 现在,这是我的问题:

  1. 我不知道如何神奇地做到这一点。
  2. 另外,我认为隐藏是浪费内存 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 }; };

这个想法是,PropertyAPropertyB 默认情况下是 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();
    }
};

现在,MaybeTruePropertyCPropertyAPropertyB 使用的值进行参数化,并且它们的值被馈送到 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();

您可以关注link查看正在运行的代码。

关于c++ - 使用 C++ 模板的逻辑函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481252/

相关文章:

logic - 如何自动证明两个一阶公式等价?

c++ - 从命令行编译一个 Qt 项目

c++ - 结构中的字符

C++ Win32 监听全局键绑定(bind)

c++ - 模板元编程三元值未达到基本情况

javascript - 亚里士多德三段论......用Javascript?

c++ - 将功能从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误

带模板的 C++ 共享库 : Undefined symbols error

c++ - 为什么这些模板模棱两可?

java - 一道java练习题