gpt4 book ai didi

精确模板参数上的 C++ 重载冲突

转载 作者:行者123 更新时间:2023-11-30 03:19:07 25 4
gpt4 key购买 nike

下面定义的bar允许两种初始化(bar的模板总是使用几个int)

template<class C>
inline void store(C dst) {}
template<class T, class C, class... E>
inline void store(C dst, T val, E... etc) {
*dst = val;
store(++dst, etc...);
}
template<class... T>
class bar {
static const int n = sizeof...(T);
int data[n];
public:
bar(int x) {for(int i=0; i<n; i++) data[i]=x;}
bar(T... x) {store(data,x...);}
};

看起来不错;但是,如果模板恰好是one int,则此代码对编译器来说是模棱两可的(尽管两者的理解具有相同的含义):

bar<int> s(3);

避免这种情况的唯一方法是专门化一个 int 案例吗? (无论如何,这会使代码更加复杂)

最佳答案

当只有一个参数并且是一个 int 时,您可以禁用可变参数构造函数。

如果你有 c++17,你可以这样做

template <
std::size_t N = sizeof...(T),
std::enable_if_t<(N != 1 || !(std::is_same_v<T, int> && ...)), bool> = true>
bar(T... x) {store(data,x...);}

否则,您可以:

template <bool... Pred>
struct all_dummy;

template <bool... Preds>
using all = std::is_same<all_dummy<Preds...>, all_dummy<((void)Preds, true)...>>;

template <
std::size_t N = sizeof...(T),
std::enable_if_t<(N != 1 || !all<std::is_same<T, int>::value...>::value), bool> = true
>
bar(T... x) {store(data,x...);}

关于精确模板参数上的 C++ 重载冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54061867/

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