gpt4 book ai didi

c++ - static_assert 如何用于检查模板函数的迭代器参数的元素类型?

转载 作者:行者123 更新时间:2023-11-30 01:16:22 24 4
gpt4 key购买 nike

我有一个函数模板,它接受一个输出迭代器参数。我如何使用 static_assert 检查实例化是否使用了适当的迭代器? (即,它既是一个输出迭代器,又分配正确类型的元素。)

#include <iostream>
#include <list>
#include <set>

template <class OutputIter>
void add_ints ( OutputIter iter )
{
static_assert ( something_goes_here,
"Arg must be an output iterator over ints" );

*iter++ = 1;
*iter++ = 2;
*iter++ = 3;
}

main()
{
// Insert iterator will add three elements.
std::set<int> my_set;
add_ints ( std::inserter ( my_set, my_set.end() ) );
for ( int i : my_set ) std::cout << i << "\n";

// Non-insert iterator will overwrite three elements.
std::list<int> my_list ( { 0, 0, 0 } );
add_ints ( my_list.begin() ) );
for ( int i : my_list ) std::cout << i << "\n";

#if 0
// Want nice compile error that container elements are not ints.
std::set<std::string> bad_set;
add_ints ( std::inserter ( bad_set, bad_set.end() ) );
#endif
#if 0
// Want nice compile error that argument is not an iterator.
class Foo {} foo;
add_ints ( foo );
#endif
}

最佳答案

OutputIterator s 不需要有值类型;他们的 value_type很可能是void , 实际上是 void对于标准库中的纯输出迭代器。

在您的原始问题中,您检查了 output_iterator_tag ,但你不应该。有很多具有不同类别的完全可变迭代器。 std::vector<int>::iterator的类别是 random_access_iterator_tag ,例如。

相反,直接检查适用表达式的格式是否正确。全部Iterator必须支持*r++r , 此外 OutputIterator必须支持*r = o , r++ , 和 *r++ = o ,所以:

template<class...>
struct make_void { using type = void; };

template<class... Ts>
using void_t = typename make_void<Ts...>::type;

template<class Iter, class U, class = void>
struct is_output_iterator_for : std::false_type {};

template<class Iter, class U>
struct is_output_iterator_for<
Iter, U,
void_t<decltype(++std::declval<Iter&>()),
decltype(*std::declval<Iter&>() = std::declval<U>()),
decltype(*std::declval<Iter&>()++ = std::declval<U>())>> : std::true_type {};

关于c++ - static_assert 如何用于检查模板函数的迭代器参数的元素类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767675/

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