将模板函数参数强制为特定类型的迭代器

时间:2014-07-17 09:51:49

标签: c++ templates c++11 iterator typechecking

关注this question

我有一个功能模板

template <typename T1, typename T2, typename IT1, typename IT2>
MethodResult<T1, T2>& method (IT1 it1begin, IT1 it1end, IT2 it2begin, IT2 it2end);

使用以下继承方案

class A
class B : A
class C : A

我希望该功能得以执行 IT1IT2是迭代器,分别取消引用T1T2

为此,我尝试了

static_assert(std::is_base_of< A, 
                               typename list<T1>::iterator::value_type >::value,
                               "wrong type");

编译很好,但是当我调用

时它没有强制执行任何操作
method<B, C>("not an", "iterator", 3, 2);

编译器不会产生错误。

请注意我先试过

        static_assert(std::is_base_of<A, 
                                      typename std::iterator_traits<T1>::value_type, 
                                      "wrong type");

在我阅读this question但编译器产生后。

wrong number of template arguments (3, should be 2)

有关如何实现此类型检查的想法吗?

1 个答案:

答案 0 :(得分:4)

这个问题含糊不清,有一些问题。但我想我得到了它的要点。您正在寻找的static_assert;

static_assert(std::is_base_of<A,
  typename std::iterator_traits<IT1>::value_type>::value,
  "wrong type");

您错过了一些括号和value等。我的格式与原始帖子类似。