Я написал какую-то бессмысленную метаданную шаблона, чтобы определить, существуют ли методы класса.
Структура шаблона has_subscript
является специализированной, так что второй параметр шаблона равен void
, если первый параметр шаблона имеет оператор индекса. Если найден подстрочный оператор, используется специализация, в противном случае SFINAE по умолчанию является неспециализированной версией.
У меня есть код, работающий с простой структурой foo (он настроен только для лучшего соответствия std::vector
), но он неожиданно завершается с std::vector
.
демонстрационная ссылка https://godbolt.org/z/5-QzAp
#include <type_traits>
#include <iostream>
#include <vector>
using namespace std;
template <typename>
struct void_wrap
{ using type = void; };
template <typename T, typename = void>
struct has_subscript
{
static constexpr bool value = false;
};
template <typename T>
struct has_subscript <T, typename void_wrap<typename result_of<decltype(&T::operator[])(T,int)>::type>::type >
{
static constexpr bool value = true;
};
template <typename T>
struct foo
{
double operator[](size_t x){return 0.0;}
};
int main()
{
cout << has_subscript<foo<int>>::value;
cout << has_subscript<vector<int>>::value;
}