linkedList.add(0,i); //9ms
arrayList.add(0,i); //780ms so 2 magnitude more
使用
在视觉工作室失败template <typename T>
using operator_square_brackets = decltype(&T::operator[]);
有关如何解决此问题的任何想法?
答案 0 :(得分:8)
如果要检测某个类型是否具有某个函数或重载运算符,则必须调用该函数或运算符。这很重要,因为您可能有多个函数或运算符重载,并且重载决策总是取决于调用者。
以下是一个基于CppCon 2014: Walter E. Brown "Modern Template Metaprogramming: A Compendium, Part II"的小例子,介绍如何检测某个类型中的operator[]
。
我不知道为什么VC会给你这么奇怪的错误,看起来更像是一个解析错误。我本来期望像»对重载函数的引用无法解决;你的意思是打电话吗?«。
#include <string>
#include <type_traits>
#include <vector>
// in C++17 std::void_t
template < typename... >
using void_t = void;
template < typename T, typename Index >
using subscript_t = decltype(std::declval<T>()[std::declval<Index>()]);
template < typename, typename Index = size_t, typename = void_t<> >
struct has_subscript : std::false_type {};
template < typename T, typename Index >
struct has_subscript< T, Index, void_t< subscript_t<T,Index> > > : std::true_type {};
struct A
{
void operator[](size_t) {}
};
struct B {};
int main ()
{
static_assert(has_subscript< std::vector<int> >::value == true , "!");
static_assert(has_subscript< std::vector<double> >::value == true , "!");
static_assert(has_subscript< A >::value == true , "!");
static_assert(has_subscript< A, std::string >::value == false, "!");
static_assert(has_subscript< B >::value == false, "!");
static_assert(has_subscript< double[5] >::value == true , "!");
static_assert(has_subscript< double* >::value == true , "!");
static_assert(has_subscript< double >::value == false, "!");
}