C ++如何重载一个函数,该函数作为参数获取不同模板化对象的迭代器?

时间:2018-01-19 15:24:56

标签: c++ templates iterator c++14 overloading

我有两个类似的泛型类 - MyClass1和MyClass2。 我想要功能" func"迭代MyClass1和/或MyClass1对象的元素。

但我得到了以下错误:

'auto' in return type deduced as 'Group3d<MyClass1<5> >' here but deduced as 'Group2d<MyClass1<5> >' in earlier return statement
        return funcForClass2<T>(start, end);
        ^

我无法弄清楚如何重载此函数,因为在调用它之后会推断出类型。

有什么建议吗?

main.cpp中:

int main() {
    list<MyClass1<5>> a = {{0}, {-5}};
    auto res5 = func(a.begin(), a.end());

    list<MyClass2<6>> b = {{0, 3}, {0, -2}};
    auto res6 = func(b.begin(), b.end());
}

utils.h:

template<typename T>
using deref_iter_t = std::remove_reference_t<decltype(*std::declval<T>())>;

template<class Iterator>
auto func(Iterator start, Iterator end) {
    int dim;

    using T = deref_iter_t<Iterator>;

    dim = (start)->getDim();
    if (dim == 2) { // MyClass1 objects
        return funcForClass1<T>(start, end);
    }
    if (dim == 3) { // MyClass2 objects
        return funcForClass2<T>(start, end);
    }
}

2 个答案:

答案 0 :(得分:1)

假设undefined是constexpr,您可以通过重载决策来实现。略微简化示例以显示相关部分:

this

答案 1 :(得分:0)

将您的功能写为

template<size_t I> 
auto func(
  const typename list<MyClass1<I>>::iterator& begin, 
  const typename list<MyClass1<I>>::iterator& end)
{ 
// do something
}

template<size_t I> 
auto func(
  const typename list<MyClass2<I>>::iterator& begin, 
  const typename list<MyClass2<I>>::iterator& end)
{
// do something else 
}

对于deref_iter_t,您似乎可以使用std::iterator_traits<Iterator>::value_type代替,无论如何不再使用。