gpt4 book ai didi

c++ - 如何定义基于 enable_if_t 的重载

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:07 25 4
gpt4 key购买 nike

我想写一个 2 重载的模板组合,如下面的代码所示,我希望在 2 上做不同的处理对象的类型。编译时出现这些错误:

// Error    C2672   'info': no matching overloaded function found
// and
// // Error C2783 'void info(StrType)': could not deduce template argument for '__formal'

代码是:


/// With this commented out, compile fails, while with it uncommented, all cals get
// in to this void template.
//template<typename T/*,
//typename = void*/>
//void info(T s) {
//
//}

template <typename StrType,
std::enable_if_t<std::is_convertible_v<std::string, StrType>, bool> = false
>
void info(StrType s) {
std::cout <<"str: "<< s << std::endl;
}


template<typename IntType,
std::enable_if_t<std::is_same_v<
typename std::remove_reference_t<typename std::remove_cv<IntType>> ,
int
>, bool> = false
>
void info(IntType s) {
std::cout <<"int: "<< s + s << std::endl;
}

int main() {
info("31"); // Error C2672 'info': no matching overloaded function found
// and
// // Error C2783 'void info(StrType)': could not deduce template argument for '__formal'

info((int)111); // Same complain as above.
}

我期待输出是强度:31整数:111但编译失败,提示:错误 C2672“信息”: 未找到匹配的重载函数

最佳答案

注意对于 std::is_convertible ,第一个模板参数是From,第二个是To,所以改变模板参数顺序从

template <typename StrType,
std::enable_if_t<std::is_convertible_v<std::string, StrType>, bool> = false
>
void info(StrType s)

template <typename StrType,
std::enable_if_t<std::is_convertible_v<StrType, std::string>, bool> = false
// ^^^^^^^^^^^^^^^^^^^^
>
void info(StrType s)

对于第二次重载,您应该从std::remove_cv 获取type,而不是直接使用它自己;所以改变

template<typename IntType,
std::enable_if_t<std::is_same_v<
typename std::remove_reference_t<typename std::remove_cv<IntType>> ,
int
>, bool> = false
>
void info(IntType s) {

template<typename IntType,
std::enable_if_t<std::is_same_v<
typename std::remove_reference_t<typename std::remove_cv<IntType>::type> ,
// ^^^^^^
int
>, bool> = false
>
void info(IntType s) {

或(C++14 起)

template<typename IntType,
std::enable_if_t<std::is_same_v<
typename std::remove_reference_t<std::remove_cv_t<IntType>> ,
// ^^
int
>, bool> = false
>
void info(IntType s) {

LIVE

关于c++ - 如何定义基于 enable_if_t 的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58480162/

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