Dei*_*Dei 7 c++ templates sfinae c++11
所以,我正在关注此网页上代码所设置的示例: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);
}
Run Code Online (Sandbox Code Playgroud)
这样我就得写:
fun<int>(4);
fun<double>(4.4);
Run Code Online (Sandbox Code Playgroud)
我怎么能避免这种情况?
编译器抱怨它无法推断出参数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>";
}
Run Code Online (Sandbox Code Playgroud)
此外,typename代码中的s与您的使用相矛盾std::enable_if_t.
使用其中一个(C++ 11):
typename std::enable_if<...>::type
Run Code Online (Sandbox Code Playgroud)
或(C++ 14):
std::enable_if_t<...>
Run Code Online (Sandbox Code Playgroud)
如何在没有返回类型的构造函数中工作?
在构造函数的情况下,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>";
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |