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

对带有3个泛型参数的模板使用std::enable-if

  •  1
  • DenverCoder21  · 技术社区  · 11 年前

    我已经找到了一些关于以下主题的线索 std::enable_if ,但不幸的是,我无法将示例应用于我的代码。

    template<class From, class To, class Value>
    struct convert
    {
      static Value apply(Value value)
      {
        return value;
      }
    };
    

    我希望只有当 From To 都是一样的,所以我尝试使用

    std::enable_if<std::is_same<From,To>::value>::Value
    

    但这行不通。我该怎么做?

    我还有这两个专业,让你更好地了解我的问题:

    template<class From, class Value>
    struct convert<From, kilometer, Value>
    {
      static Value apply(Value value)
      {
        doSomething;
      }
    };
    
    template<class To, class Value>
    struct convertImpl <kilometer, To, Value>
    {
      static Value apply(Value value)
      {
        doSomethingElse;
      }
    };
    

    这就是我回避问题的根源。现在我在陈述这个案子 从…起 都是相同的,从而使代码易于编译。但我想只返回这两个类型相同的值。

    2 回复  |  直到 11 年前
        1
  •  4
  •   WhozCraig    11 年前

    从你的描述来看,我认为你不需要SFINAE 认为 你只需要一个专业化:

    template<class From, class To, class Value>
    struct convert
    {
        static Value apply(Value value)
        {
            Value somethingElse = ...;
            return somethingElse;
        }
    };
    
    template<class From, class Value>
    struct convert<From,From,Value>
    {
        static Value apply(Value value)
        {
            return value; // SAME
        }
    };
    

    我承认我真的看不出这有什么意义 Value 是两者的独立类型 From To ,但你可能知道一些我不知道的事情。如果您希望将整个结构专门化,这似乎是您的愿望。 See it live .

    祝你好运

        2
  •  3
  •   Piotr Skotnicki    10 年前
    template<class From, class To, class Value>
    struct convert
    {
        template <typename F = From, typename T = To>
        static auto apply(Value value) -> typename std::enable_if<std::is_same<F,T>::value, Value>::type
        {
            static_assert(std::is_same<F, From>::value && std::is_same<T, To>::value, "");
            // no conversion
            return value;
        }
    
        template <typename F = From, typename T = To>
        static auto apply(Value value) -> typename std::enable_if<!std::is_same<F,T>::value, Value>::type
        {
            static_assert(std::is_same<F, From>::value && std::is_same<T, To>::value, "");
            // do conversion
            return value;
        }
    };
    

    DEMO

    或者,这可以使用基于标记的调度来实现:

    template<class From, class To, class Value>
    struct convert
    {
        static Value apply(Value value)
        {
            using tag = std::integral_constant<bool, std::is_same<From, To>::value>; 
            return _apply(value, tag{});
        }
    
    private:
        static Value _apply(Value value, std::true_type)
        {
            // no conversion
            return value;
        }
    
        static Value _apply(Value value, std::false_type)
        {
            // do conversion
            return value;
        }
    };
    

    DEMO 2