gpt4 book ai didi

c++ - 重载函数不编译的简单 SFINAE 示例

转载 作者:行者123 更新时间:2023-11-30 01:37:26 25 4
gpt4 key购买 nike

我指的是这个例子SFINAE example ,

我试过运行示例,

//enable_if
template<bool, typename T = void>
struct enable_if {};
template <typename T>
struct enable_if<true, T> {
using type = T;
};

template <typename T>
void do_stuff(typename enable_if<std::is_integral<T>::value, T>::type &t) {
std::cout<< "Integral selected "<<std::endl;
}

template <typename T>
void do_stuff(typename enable_if<std::is_class<T>::value, T>::type &t) {
std::cout<<"Class selected " <<std::endl;
}

int main()
{
int t =25;
do_stuff(t);
return 0;
}

但是这不会编译,我可以知道为什么吗?

最佳答案

除了其他解决方案之外,如果您不想将 enable_if 作为返回值,您可以将其作为参数类型传递,然后作为函数签名的一部分:

#include <type_traits>
#include <iostream>

//enable_if
template<bool, typename T = void>
struct enable_if {};
template <typename T>
struct enable_if<true, T> {
using type = int; // must be a non-type template parameter
};

template <typename T, typename enable_if<std::is_integral<T>::value, T>::type = 0>
void do_stuff(T &t) {
std::cout<< "Integral selected "<<std::endl;
}

template <typename T, typename enable_if<std::is_class<T>::value, T>::type = 0>
void do_stuff(T &t) {
std::cout<<"Class selected " <<std::endl;
}

class Foo
{
public:
Foo() = default;
};

int main()
{
int t =25;
Foo f;
do_stuff(t);
do_stuff(f);
return 0;
}

关于c++ - 重载函数不编译的简单 SFINAE 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com