簡體   English   中英

如果帶有3個通用參數的模板使用std :: enable

[英]Using std::enable if for template with 3 generic arguments

我已經找到了一些關於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;
  }
};

這就是我的肥胖問題的根源。 現在,我正在靜態聲明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
    }
};

我承認我真的沒有看到這種意義,因為ValueFromTo的獨立類型,但是您可能對此有些了解,但我不知道。 如果您希望完整的結構專業化,這似乎是您的願望。 現場觀看

祝你好運

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM