Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带C+的逻辑函数+;模板_C++_Templates_Logic - Fatal编程技术网

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

注意: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;
};
模板
阶级基础
{
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
    是浪费内存
  • 有人提出了一个解决方案,我如何用上面的属性做一些“a和B意味着C”?您可以更改某些内容,但属性仍应像
    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<代码>的价值是一个特性。