使用std::enableif-for-template和3个通用参数

Using std::enable if for template with 3 generic arguments

本文关键字:3个 参数 std enableif-for-template 使用      更新时间:2023-10-16

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

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

我希望只有当FromTo相同时才激活它,所以我尝试使用

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

这就是我的含糊问题的根源。现在,我正在静态断言FromTo相同的情况,从而使代码可以编译。但当这两个类型相同时,我只想返回值。

我不认为你想要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是一个独立于FromTo的类型,但你可能知道一些我不知道的东西。如果你想要完整的结构专门化,这似乎是你的愿望现场观看

祝好运

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

演示

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

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

演示2