[英]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
的使用相矛盾。
使用任一c++11 :
typename std::enable_if<...>::type
或c++14 :
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>";
}
};
或者,在c++20中,您可以為此使用概念:
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.