簡體   English   中英

聲明模板參數是迭代器/指針

[英]Asserting a Template Argument is an Iterator/Pointer

我有一個帶指針的模板化函數。

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

如何更改foo以確保通過迭代器/指針? 我認為有一種static_assertenable_if方式可以做到這一點,但我似乎找不到它。

您可以使用std::iterator_traits來檢查它是否是迭代器(或指針)

template <typename IT>
decltype(std::iterator_traits<IT>::iterator_category{}, void())
foo(IT bar);

要檢查指針,可以使用std::is_pointer 要檢查迭代器,可以按照此答案中的說明定義自己的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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM