#include <iostream>
#include <array>
#include <vector>
template <typename T, typename SFINAE=void>
struct trait;
template <typename T>
struct trait<T, decltype(
std::declval<const T&>().begin(),
std::declval<const T&>().end(),
void()
)> {
static const char* name() { return "Container"; }
};
template <typename T, std::size_t N>
struct trait<std::array<T,N>> {
static const char* name() { return "std::array"; }
};
int main(int argc, char* argv[]) {
std::cout << trait<std::vector<int>>::name() << std::endl;
std::cout << trait<std::array<int,2>>::name() << std::endl;
}
Я ожидал, что третий шаблон будет более специализированным, чем второй, но я получил неоднозначную копию шаблона.
Есть ли способ сделать третий шаблон более специализированным? Явно проверяю, не будет ли работать для меня T
std::array
во втором шаблоне. Я пишу библиотеку и хотел бы, чтобы пользователи могли определить свои собственные специализаций trait
. Второй шаблон предназначен для общей специализации для контейнеров в отсутствие более конкретного признака.