断言模板参数是迭代器/指针

时间:2015-07-28 11:47:04

标签: c++ pointers iterator static-assert enable-if

我有一个带有指针的模板化函数。

template <typename T>
void foo(const T* bar){}

如何更改foo以确保我传递迭代器/指针?我假设有一种static_assertenable_if方式,但我似乎无法找到它。

2 个答案:

答案 0 :(得分:1)

您可以使用mysql(i)来检查它是否是迭代器(或指针)

unlink

答案 1 :(得分:0)

要检查指针,可以使用std::is_pointer。要检查迭代器,您可以按照this answer中的说明定义自己的is_iterator特征。如果你将这两者结合起来,你会得到:

#include <type_traits>
#include <iterator>

template<typename T, typename = void>
struct is_iterator
{
   static constexpr bool value = false;
};

template<typename T>
struct is_iterator<T, typename std::enable_if<
    !std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type>
{
   static constexpr bool value = true;
};

template<class T>
void test(T t) {
  static_assert(std::is_pointer<T>::value || is_iterator<T>::value,
                "T must be pointer or iterator");
}