代码之家  ›  专栏  ›  技术社区  ›  dfrib

在C++ 03中,如何根据类型特征有条件地声明模板类的静态数据成员。

  •  1
  • dfrib  · 技术社区  · 6 年前

    背景

    考虑到我想, 在C++ 03中

    (+)

    template< typename T >  // parameter list must contain T but may otherwise modified
    struct foo;
    

    dummy_trait<T>::value 在模板参数上 T foo true ,然后 应包含静态数据成员 value ,类型 T型 42 ;否则不应该有静态数据 价值 .

    例如 dummy_trait

    template< typename T >
    struct dummy_trait { static const bool value = false; };
    
    template<>
    struct dummy_trait<int> { static const bool value = true; };
    

    问题

    • 是否有其他(可能更合适的)替代方案来实现 (+) ,除了下面的两种方法之外?
    • 使用以下两种方法中的任何一种,是否有任何陷阱或方面需要仔细记住?

    我自己的方法

    使用助手

    template< bool B, typename T = void >
    struct enable_if {};
    
    template< typename T >
    struct enable_if<true, T> { typedef T type; };
    

    例如,使用部分类模板专门化:

    // (A)
    template< typename T, typename Enable = void >
    struct foo {};
    
    template< typename T >
    struct foo<T, typename enable_if<dummy_trait<T>::value>::type > { 
        static const T value = 42; 
    };
    

    或例如。 利用SFINAE 在静态数据成员的声明中引入条件(基于特征)错误:

    // (B)
    template< typename T >
    struct foo {
        static const typename enable_if<
            dummy_trait<T>::value, T >::type value = 42;
    };
    

    如果我没弄错, (A) 上面允许使用 也用于类型的实例化 哪里 虚拟特性:值 false 价值 成员 ),而如果使用 (B)

    1 回复  |  直到 6 年前
        1
  •  4
  •   max66    6 年前

    除了下面的两种方法(利用SFINAE)之外,是否还有其他(可能更合适的)替代方法来实现“+”?

    与你的解决方案(a)没有太大区别,但是。。。你可以通过继承获得结果

    template <typename T>
    struct foo : public bar<T>
     { };
    

    在哪里? bar

    template <typename T, bool = dummy_trait<T>::value>
    struct bar { };
    
    template <typename T>
    struct bar<T, true> { static const T value = 42; };
    

    你也可以看到 酒吧 以更简单的方式(不 enable_if )获得 foo

    使用以下两种方法中的任何一种,是否有任何陷阱或方面需要仔细记住?

    我看到的唯一陷阱就是你刚刚看到的那个:方法(B)不起作用,因为你不能定义 dummy_trait<T>::value false

    我是说。。。(B) 是不是因为替换失败,在这种情况下, 一个错误。