我需要一个带有两个参数的函数 arg1
和 arg2
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/