我正在嘗試使用std::enable_if_t和std::is_integral_v模板來專門化一個類的 mem-func。我讀過這個,但它是關于通用函式而不是成員函式。
我模仿它并按如下方式撰寫我的代碼,但它不起作用。
namespace oct {
class Class1 {
template< typename T> T memf();
};
template< typename T>
std::enable_if_t< std::is_integral_v<T>, T> Class1::memf() {
std::cout << "Integral." << std::endl;
return 1;
};
template< typename T>
std::enable_if_t < ! std::is_integral_v<T>, T > Class1::memf() {
std::cout << "None-Integral." << std::endl;
return T {};
};
};
編譯錯誤訊息:
沒有宣告匹配 'std::enable_if_t<is_integral_v, T> oct::Class1::memf()
uj5u.com熱心網友回復:
您可以按如下所示進行操作:
版本 1
#include <iostream>
#include <type_traits>
namespace oct{
class Class1 {
public:
template< typename T>
std::enable_if_t< std::is_integral_v<T>, T> memf() ;
template< typename T>
std::enable_if_t < ! std::is_integral_v<T>, T > memf();
};
}
template< typename T>
std::enable_if_t< std::is_integral_v<T>, T> oct::Class1::memf() {
std::cout << "Integral." << std::endl;
return 1;
}
template< typename T>
std::enable_if_t < ! std::is_integral_v<T>, T > oct::Class1::memf() {
std::cout << "None-Integral." << std::endl;
return T {};
}
int main()
{
oct::Class1 f;
f.memf<int>();//prints "Integral."
f.memf<int*>();//prints "Non-Integral."
}
版本 2
#include <iostream>
#include <type_traits>
namespace oct{
class Class1 {
public:
template< typename T>
std::enable_if_t< std::is_integral_v<T>, T> memf() {
std::cout << "Integral." << std::endl;
return 1;
}
template< typename T>
std::enable_if_t < ! std::is_integral_v<T>, T > memf() {
std::cout << "None-Integral." << std::endl;
return T {};
}
};
}
int main()
{
oct::Class1 f;
f.memf<int>(); //prints "Integral."
f.memf<int*>();//prints "Non-Integral."
}
另請注意,函式模板不能部分特化。
我還洗掉;了您程式中不必要的分號。
uj5u.com熱心網友回復:
作為 SFINAE 的替代方案,您可以使用if constexpr:
class Class1
{
template <typename T>
T memf()
{
if constexpr (std::is_integral_v<T>)
{
std::cout << "Integral." << std::endl;
return 1;
} else {
std::cout << "Non-Integral." << std::endl;
return T {};
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/366259.html
