【问题标题】:Logic Functions with C++ Templates [closed]带有 C++ 模板的逻辑函数 [关闭]
【发布时间】:2012-09-18 16:33:51
【问题描述】:

关于 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 设置为 Inherited 中的 TrueProperty。 现在,这是我的问题:

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

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

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

【问题讨论】:

  • 附带说明,MaybeTruePropertyA,B,C 在 Base 中是私有的,因此在 Inherited 中看不到。其次,我不明白“希望神奇地将 PropertyC 设置为继承中的 TrueProperty”是什么意思。但更重要的是,您不需要在 Inherited 中“隐藏”MaybeTruePropertyA,因为它已经隐藏了
  • Base可以有模板参数吗?
  • 我很确定你需要的任何事情都可以通过一些简单的特征检查(例如std::is_base_of)来完成,但我不太了解这里的确切要求......
  • "您可以添加任意数量的模板。"在这里说这种话很危险。 :-O
  • 您的伪代码及其附带的描述有一些问题,即没有PropertyC,您不能使用S 和其他作为模板参数。以前有人问过,但我觉得我必须坚持:你能用英语表达你的要求吗?或者可能使用不显示BaseInherited 实现的简单代码表达式?

标签: c++ templates logic


【解决方案1】:

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

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

这个想法是PropertyAPropertyB默认是false属性。它们是通过专业化制作的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();
    }
};

现在,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 以查看正在运行的代码。

【讨论】:

  • 哇,这正是我一直在寻找的。我是否理解第 18 行中的编译器首先尝试匹配 PropertyC,如果模板参数之一为 false,那么它匹配 Property
  • @Johannes:本质上。有四种类型与PropertyC&lt;bool, bool&gt; 模板相关联。除了PropertyC&lt;true, true&gt; 的特化之外,所有这些都被同等对待。
  • 啊,我认为这种技术在 C++ 中被称为“特征”。对吗?
  • @Johannes:是的,您可以将V 的值视为特征。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多