c++ - 在编译时计算迭代器返回类型

标签 c++ templates

我需要一个带有两个参数的函数 arg1arg2

template<class T1, class T2>
SomeReturnType Foo(T1 arg1, T2 arg2);

参数可以是指针或 std::iterator,或者是 random_access_iterator 的 bidirectional_iterator。 Foo对那些迭代器做了一些操作,需要返回一个迭代器给另一个对象,但是返回的迭代器是下面的类型

ptr, T   -> iterator< iterator_traits<T>::iterator_category >
T,   ptr -> iterator< iterator_traits<T>::iterator_category >
ptr, ptr -> iterator< random_access_iterator_tag >

random_access_iterator, random_access_iterator -> iterator< random_access_iterator_tag >

random_access_iterator, T -> iterator< iterator_traits<T>::iterator_category >
T, random_access_iterator -> iterator< iterator_traits<T>::iterator_category >
T, T                      -> iterator< bidirectional_iterator_tag> >

我计划根据参数的 iterator_category_tags 从 Foo 调用辅助函数,使用函数重载来处理调度。但是我不知道如何计算 Foo 的返回类型。

编辑:我现在看到问题了。 Foo 的返回类型派生自 std::iterator,并且可以是 Foo 函数的参数。这是一个问题,因为我一直在使用的 traits 类没有专门用于这些返回类型,只有返回类型的基类。我认为解决方案是使用 is derived_from 元函数。

EDIT2:标题显然没有反射(reflect)问题的内容。为了让这对其他人有用,我正在征求有关更好标题的建议。

最佳答案

如果我正确地理解您正在寻找一种从参数类型派生返回类型的方法,您可以用经典的方式来完成,例如以下(对于前几种情况):

#include <iterator>

template<typename T1, typename T2>
struct ret_iterator {};

// ptr, T   -> iterator< iterator_traits<T>::iterator_category >
template<typename P, typename T>
struct ret_iterator<P *, T>
{
  typedef std::iterator<typename std::iterator_traits<T>::iterator_category, P> iter;
};

// T,   ptr -> iterator< iterator_traits<T>::iterator_category >
template<typename T, typename P>
struct ret_iterator<T, P *>
{
  typedef std::iterator<typename std::iterator_traits<T>::iterator_category, P> iter;
};

// ptr, ptr -> iterator< random_access_iterator_tag >
template<typename P>
struct ret_iterator<P *, P *>
{
  typedef std::iterator<std::random_access_iterator_tag, P> iter;
};

// random_access_iterator, T -> iterator< iterator_traits<T>::iterator_category >
template<typename T>
struct ret_iterator<std::random_access_iterator_tag, T>
{
  typedef std::iterator<typename std::iterator_traits<T>::iterator_category, T> iter;
};

template<typename P, typename T>
struct ret_iterator<std::iterator<std::random_access_iterator_tag, P>, T>
{
  typedef typename ret_iterator<std::random_access_iterator_tag, T>::iter iter;
};

关于c++ - 在编译时计算迭代器返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582497/

相关文章:

c++ - 内联函数指针以避免 if 语句

c++ - 以下哪些模仿 C++17 之前的折叠表达式的技术被认为是惯用的?

c++ - 对于构造函数,我如何在可变参数模板与 std::initializer_list 之间进行选择?

templates - StarUML 类图 : How to manually add Generics (Template Type T) for a class

C++ - 查找当前 CPU 使用情况(以赫兹为单位)(Windows)

c++ - 将函数参数添加到 vector

C++ 模板和不明确的函数调用

django - 在 Django 模板中构建动态 IMG URL

c++ - 零大小数组不适用于模板

c++ - 使用 iostream 处理错误