gpt4 book ai didi

c++ - 强制先尝试一个过载,然后再返回另一个

转载 作者:行者123 更新时间:2023-11-28 02:33:44 25 4
gpt4 key购买 nike

作为更广泛问题的一个示例,给定这两个重载,您可能会认为在传递数组时数组版本会优先:

template <size_t N>
void bar(const char (&)[N]) {
std::cout << "array, size=" << N-1 << std::endl;
}
void bar(const char *s) {
std::cout << "raw, size=" << strlen(s) << std::endl;
}

但是当传递一个数组(字符串文字是一个数组)时,bar("hello"),将调用后一个版本(指针版本)。

这个特殊案例 has been discussed在 SO 上,答案很有趣。但这里有一个普遍的问题。我想强制编译器更喜欢一个重载,并且只有在所有合法的调用它的尝试都失败时才放弃该重载。

为了清楚起见,我们将它们重命名为 bar1bar2:

template <size_t N>
void bar1(const char (&)[N]) {
std::cout << "array, size=" << N-1 << std::endl;
}
void bar2(const char *s) {
std::cout << "raw, size=" << strlen(s) << std::endl;
}

在不进一步改变这些的情况下,我们可以这样写吗:

template<typename ...Args>
auto try_bar1_then_bar2(Args&& ...args) -> ??? {
... will first attempt to perfect forward to bar1 ...
... only if bar1 cannot be called, fallback to bar2 ...
}

我在这个问题中使用了一些 C++11,用 && 来完美转发,但我想这个一般问题也适用于早期的 C++。是否有一种简单、通用的方法来强制重新排序过载优先级?当一组函数(具有不同名称?)(几乎)不可调用时,如何准确控制它们的尝试顺序?

最佳答案

一些表达 SFINAE:

template<typename ...Args>
auto try_bar1_then_bar2_IMPL(int, Args&& ...args) -> decltype( bar1(forward<Args>(args)...) ) {
cout << "Yes, we can call bar1" << endl;
return bar1(forward<Args>(args)...);
}
template<typename ...Args>
auto try_bar1_then_bar2_IMPL(char, Args&& ...args) -> void {
cout << "No, can't call bar1, calling bar2 instead." << endl;
return bar2(forward<Args>(args)...);
}
template<typename ...Args>
auto try_bar1_then_bar2(Args&& ...args) -> decltype( try_bar1_then_bar2_IMPL(0, forward<Args>(args)...) ) {
return try_bar1_then_bar2_IMPL(0, forward<Args>(args)...);
}

bar1无法调用,try_bar1_then_bar2_IMPL 的第一个重载无效,因为 decltype在返回类型中失败。但是如果 bar1可以被调用,那么两者都是有效的(并且是完美匹配的,我认为)。因此,我在前面添加了一个虚拟参数,即 int。或 char , 打破平局有利于对 bar1 的调用.

这样调用:

try_bar1_then_bar2("hello");  // array, calls array version
try_bar1_then_bar2(+"hello"); // + converts to a pointer, therefore
// this calls the pointer ('raw') version.

关于c++ - 强制先尝试一个过载,然后再返回另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28249759/

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