gpt4 book ai didi

c++ - ADL 在特定情况下不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:20:44 28 4
gpt4 key购买 nike

我制作了如下所示的 is_iterable 模板 - 它检查自由函数开始/结束是否可用(在 ADL 的上下文中)并返回正确的迭代器对象。 (这是在 ranged-for 循环中对可迭代对象的要求)

#include <utility>
#include <iterator>
#include <type_traits>
#include <vector>

template <typename T>
typename std::add_rvalue_reference<T>::type declval(); // vs2010 does not support std::declval - workaround

template <bool b>
struct error_if_false;

template <>
struct error_if_false<true>
{
};

template<typename U>
struct is_input_iterator
{
enum {
value = std::is_base_of<
std::input_iterator_tag,
typename std::iterator_traits<U>::iterator_category
>::value
};
};

template<typename T>
struct is_iterable
{
typedef char yes;
typedef char (&no)[2];

template<typename U>
static auto check(U*) -> decltype(
error_if_false<
is_input_iterator<decltype(begin(declval<U>()))>::value
>(),
error_if_false<
is_input_iterator<decltype(end(declval<U>()))>::value
>(),
error_if_false<
std::is_same<
decltype(begin(declval<U>())),
decltype(end(declval<U>()))
>::value
>(),
yes()
);

template<typename>
static no check(...);

public:
static const bool value = (sizeof(check<typename std::decay<T>::type>(nullptr)) == sizeof(yes));
};

#include <cstdio>
void write(int a)
{
printf("%d\n", a);
}

template<typename T>
typename std::enable_if<is_iterable<T>::value>::type write(const T& a)
{
for (auto i = begin(a), e = end(a); i != e; ++i) {
write(*i);
}
}

int main()
{
write(10);

std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);

write(a);
}

以上代码在 vs2010 中完全按照预期工作,但在 gcc 中则不然。此外,当我放置一些名为“开始”的随机自由函数时,如下所示,即使在 vs2010 中它也会被破坏。

int begin(int)
{
}

如何使代码正常工作?此外,任何改进“is_iterable”概念检查器的建议都将不胜感激。

补充:“write”函数只是一个概念演示示例,请不要在上面投入宝贵的时间。 (我知道这不是最好的代码 :( )需要注意的部分是 ADL 行为和“is_iterable”模板 :)

最佳答案

std:: 添加到 begin/end 后 - 您的代码在 gcc-4.6 下编译和运行

改进建议:将error_if_false替换为enable_if

关于c++ - ADL 在特定情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383722/

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