断言模板参数是 Iterator/Pointer
Asserting a Template Argument is an Iterator/Pointer
我有一个接受指针的模板化函数。
template <typename T>
void foo(const T* bar){}
如何更改 foo
以确保通过 iterator/pointer?我假设有 static_assert
或 enable_if
方法可以做到这一点,但我似乎找不到它。
您可以使用std::iterator_traits
来检查它是否是一个迭代器(或指针)
template <typename IT>
decltype(std::iterator_traits<IT>::iterator_category{}, void())
foo(IT bar);
要检查指针,您可以使用 std::is_pointer
. To check for an iterator, you can define your own is_iterator
trait as described in this answer。如果将这两者结合起来,您将得到:
#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");
}
我有一个接受指针的模板化函数。
template <typename T>
void foo(const T* bar){}
如何更改 foo
以确保通过 iterator/pointer?我假设有 static_assert
或 enable_if
方法可以做到这一点,但我似乎找不到它。
您可以使用std::iterator_traits
来检查它是否是一个迭代器(或指针)
template <typename IT>
decltype(std::iterator_traits<IT>::iterator_category{}, void())
foo(IT bar);
要检查指针,您可以使用 std::is_pointer
. To check for an iterator, you can define your own is_iterator
trait as described in this answer。如果将这两者结合起来,您将得到:
#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");
}