C++ C++;特定类型的迭代器

C++ C++;特定类型的迭代器,c++,c++11,C++,C++11,如何创建限制基础类型的迭代器?例如,我想创建如下函数: void functionThatOperatesOnPointSequence(PointIterator begin, PointIterator end); 其中,点对象的序列可以不同的方式存储。我的用例将具有额外的复杂性,Point将是模板化类型。i、 e.点或点同样有效 使用C++11/14或Boost的解决方案是有效的且更可取 下面是一些模板元编程is_template_instance获取只接受类型和类型的模板,如果第二个类

如何创建限制基础类型的迭代器?例如,我想创建如下函数:

void functionThatOperatesOnPointSequence(PointIterator begin, PointIterator end);
其中,
对象的序列可以不同的方式存储。我的用例将具有额外的复杂性,
Point
将是模板化类型。i、 e.
同样有效


使用C++11/14或Boost的解决方案是有效的且更可取

下面是一些模板元编程
is_template_instance
获取只接受类型和类型的模板,如果第二个类型是第一个模板的实例,则返回true

template<template<class...>class Z, class T>
struct is_template_instance:std::false_type{};
template<template<class...>class Z, class...Ts>
struct is_template_instance<Z,Z<Ts...>>:std::true_type{};
我们将上述两种方法组合起来,编写一个
is\u point\u迭代器
模板:

template<class It>
using is_point_iterator = is_template_instance< Point, it_value_type<It> >;
用处有限

您可以以更方便的方式从PointIterator中提取值类型,例如:

template<class It>
using it_value_type = std::decay_t<decltype(*std::declval<It>())>;
模板
使用它\u值\u类型=标准::衰减\u t;

如果您需要SFINAE支持。

您是否创建了一些内容?这是堆栈溢出,所以若你们已经做了一些努力,你们应该问这个问题。不要要求现成的解决方案。
PointIterator::operator*
只能返回一种类型的对象<代码>点迭代器可能应该是一个模板参数。
是一个点::值
?还有一个问题是来自
的派生类是否应该被视为
。(目前不是你的情况)。@Jarod42我可以想出一个简单的解决方案(基于函数重载),它不区分从
派生的类型和带有
操作符点的类型(&)(
)。可能我应该重构为
,使之更易于使用。
template<class PointIterator,
  class=std::enable_if_t< is_point_iterator<PointIterator>::value >
>
void functionThatOperatesOnPointSequence(PointIterator begin, PointIterator end) {
  // ...
}
template<class It>
using it_value_type = std::decay_t<decltype(*std::declval<It>())>;