gpt4 book ai didi

c++ - 如何只允许具有特定 value_type 的迭代器?

转载 作者:行者123 更新时间:2023-11-30 01:04:50 33 4
gpt4 key购买 nike

我想编写一个类,将一对迭代器作为构造函数的参数,但我不知道如何在这些迭代器的 value_type 不匹配时在编译时引发错误一个预期的类型。这是我尝试使用 typeid 的结果:

#include <vector>

struct foo {
std::vector<double> data;
template <typename IT>
foo(IT begin, IT end){
typedef int static_assert_valuetype_is_double[
typeid(typename IT::value_type) == typeid(double) ? 1 : -1
];
std::cout << "constructor called \n";
data = std::vector<double>(begin,end);
}
};

int main()
{
std::vector<double> x(5);
foo f(x.begin(),x.end()); // double: ok

std::vector<int> y(10);
foo g(y.begin(),y.end()); // int: should not compile
}

请注意,在这种情况下,intdouble 会很好,但这只是一个示例,在实际代码中,类型必须完全匹配。令我惊讶的是,在这两种情况下,构造函数都没有错误地工作(只有关于未使用的 typedef 的警告)。当在方法内部声明 typedef 时,-1 大小的数组静态断言技巧是否不起作用? IT::value_type 类型错误时,如何产生错误?

PS:如果有简单的 C++98 解决方案就好了,但如果这变得太复杂,我也可以接受 C++11 解决方案。

最佳答案

在现代 C++ 中,您可以使用 std::is_same static_assert :

static_assert(std::is_same_v<typename std::iterator_traits<IT>::value_type, double>,
"wrong iterator");

另见 std::iterator_traits : 一个迭代器 it不保证有 value_type typedef,应该使用 std::iterator_traits<it>::value_type相反。

在 C++ 98 中,is_same实现起来很简单,static_assert需要一个 negative-size array trick BOOST_STATIC_ASSERT .

关于c++ - 如何只允许具有特定 value_type 的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49358766/

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