簡體   English   中英

SFINAE: std::enable_if 作為函數參數

[英]SFINAE: std::enable_if as function argument

因此,我正在按照此網頁某處的代碼設置的示例進行操作:http: //eli.thegreenplace.net/2014/sfinae-and-enable_if/

這是我所擁有的:

template<typename T>
void fun(const typename std::enable_if_t<std::is_integral<T>::value, T>& val) {
    std::cout << "fun<int>";
}

template<typename T>
void fun(const typename std::enable_if_t<std::is_floating_point<T>::value, T>& val) {
    std::cout << "fun<float>";
}

int main()
{
    fun(4);
    fun(4.4);
}

這樣我就必須寫:

fun<int>(4);
fun<double>(4.4);

我將如何避免這種情況?

編譯器抱怨它無法推斷出參數T

這些示例錯誤的,因為T處於非推導上下文中 除非你像fun<int>(4); ,代碼不會編譯,但這可能不是作者想要展示的。

正確的用法是允許編譯器推導T ,並將 SFINAE 條件放在其他地方,例如,在返回類型語法中:

template <typename T>
auto fun(const T& val)
    -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "fun<int>";
}

template <typename T>
auto fun(const T& val)
    -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "fun<float>";
}

演示

此外,代碼中的typename與您對std::enable_if_t的使用相矛盾。

使用任一

typename std::enable_if<...>::type

std::enable_if_t<...>

這在沒有返回類型的構造函數中如何工作?

對於構造函數,SFINAE 條件可以隱藏在模板參數列表中:

struct A
{    
    template <typename T,
              typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
    A(const T& val)
    {
        std::cout << "A<int>";
    }

    template <typename T,
              typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
    A(const T& val)
    {
        std::cout << "A<float>";
    }
};

演示 2

或者,在中,您可以為此使用概念:

A(const std::integral auto& val);

A(const std::floating_point auto& val);

要進行推導,您需要一個直接基於T的函數參數。 然后,您需要弄清楚將enable_if放在哪里(這確實不允許推導T )。 常見選項在返回類型上或在您忽略的額外默認參數上。

這里有一些很好的例子:http: //en.cppreference.com/w/cpp/types/enable_if

暫無
暫無

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

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