[英]Specialize member func for integral template arg with c++17
I'm trying to use std::enable_if_t
and std::is_integral_v
templates to specialize a mem-func of a class.我正在尝试使用std::enable_if_t
和std::is_integral_v
模板来专门化 class 的 mem-func。 I read this , but it is about common functions instead of member-function.我读了这个,但它是关于通用函数而不是成员函数。
I mimic it and write my codes as following, but it does NOT work.我模仿它并编写我的代码如下,但它不起作用。
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 {};
};
};
Compiling Error Msg:编译错误消息:
no declaration matches 'std::enable_if_t<is_integral_v, T> oct::Class1::memf()没有声明匹配 'std::enable_if_t<is_integral_v, T> oct::Class1::memf()
You can do it as shown below:您可以如下所示进行:
Version 1版本 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."
}
Version 2版本 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."
}
Also, note that function templates cannot be partially specialized.另外,请注意function 模板不能部分特化。
As alternative to SFINAE, you might use if constexpr
:作为 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 {};
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.