如何檢查模板參數是否爲std::vector<T>::iterator
?檢查模板參數是否爲std :: vector <T> :: iterator
對於void類型,我們有std :: is_void。 std::vector<T>::iterator
有沒有這樣的事情?
如何檢查模板參數是否爲std::vector<T>::iterator
?檢查模板參數是否爲std :: vector <T> :: iterator
對於void類型,我們有std :: is_void。 std::vector<T>::iterator
有沒有這樣的事情?
你可以創建一個特點:
#include <vector>
#include <list>
#include <type_traits>
template <class T, class = void>
struct is_vector_iterator: std::is_same<T, std::vector<bool>::iterator> { };
template <class T>
struct is_vector_iterator<T, decltype(*std::declval<T>(), std::enable_if_t<!std::is_same<T, std::vector<bool>::iterator>::value>())>: std::is_same<T, typename std::vector<std::decay_t<decltype(*std::declval<T>())>>::iterator> { };
int main() {
static_assert(is_vector_iterator<std::vector<int>::iterator>::value, "Is not a vector iterator");
static_assert(is_vector_iterator<std::vector<bool>::iterator>::value, "Is not a vector iterator");
static_assert(!is_vector_iterator<std::list<int>::iterator>::value, "Is a vector iterator");
static_assert(!is_vector_iterator<std::list<int>::iterator>::value, "Is a vector iterator");
}
你可以寫這樣的特質:
namespace detail
{
template<typename T> constexpr std::false_type is_vector_iterator(T&&, ...)
{
return {};
}
template<typename T>
constexpr auto is_vector_iterator(T&& t, void* = nullptr) ->
decltype(std::is_same<typename std::vector<std::decay_t<decltype(*t)>>::iterator, std::decay_t<T>>{})
{
return {};
}
}
template<typename T>
struct is_vector_iterator : decltype(detail::is_vector_iterator(declval<T>(), 0)) {};
在這裏,我發現了腐朽的類型* T製作vector<type>::iterator
並檢查與T
是否相等。它適用於vector<bool>
這個例外,它不是一個真正的矢量。
我想:
#include <list>
#include <vector>
#include <iterator>
template <class It, class = void>
struct is_vector_iterator : std::false_type { };
template <class It>
struct is_vector_iterator<It, std::enable_if_t<
std::is_same<
It,
typename std::vector<
typename std::iterator_traits<It>::value_type
>::iterator
>::value
>> : std::true_type { };
int main() {
static_assert(is_vector_iterator<std::vector<int>::iterator>::value, "Is not a vector iterator");
static_assert(is_vector_iterator<std::vector<bool>::iterator>::value, "Is not a vector iterator");
static_assert(!is_vector_iterator<std::list<int>::iterator>::value, "Is a vector iterator");
}
使用'std :: iterator_traits
因爲如上所述** Bo Persson **以上:*該標準允許'std :: vector
@ComeRaczy另外,要處理'bool'的情況,其中'* std :: declval
另一種解決方案也採用的std :: iterator_traits:
#include <iostream>
#include <vector>
#include <list>
template <typename T>
struct is_vector_iterator
{
typedef char yes[1];
typedef char no[2];
template <typename C>
static yes& test(
typename std::enable_if<
std::is_same<T, typename std::vector<typename C::value_type>::iterator>::value
>::type*);
template <typename>
static no& test(...);
static const bool value = sizeof(test<T>(nullptr)) == sizeof(yes);
};
int main() {
std::cout << is_vector_iterator<int>::value << std::endl;
std::cout << is_vector_iterator<int*>::value << std::endl;
std::cout << is_vector_iterator<std::list<int>::iterator>::value << std::endl;
std::cout << is_vector_iterator<std::vector<int>::iterator>::value << std::endl;
return 0;
}
不幸的是,它也適用於'std :: list
我現在修好了! –
所以你認爲:[demo](http://coliru.stacked-crooked.com/a/5e5b2e165bd94081) –
@ W.F。在我添加之前,''沒有出現。對不起。我正在考慮編寫自定義特徵。像'template std :: vector class> struct is_vec_iterator {static const bool value = true; };' –
我不相信你可以,但你可以檢查參數是否是一個隨機訪問迭代器。 – aschepler
我認爲模板的重點是沒有明確的。如果您需要針對特定類型的特殊實現使用模板專業化 – user2717954