У меня есть следующий метод в template <class Base> class foo {}
:
template <
typename V,
template <class, class> class Map,
Map<std::string, V> Base::*Field,
std::size_t Len
>
constexpr const foo<Base> s(char const (§ion_name)[Len]) const {
#pragma unused(section_name)
return *this;
}
Моя цель - иметь возможность вызывать его просто с помощью:
struct my_struct {
std::map<std::string, int> section;
constexpr auto bar = foo<my_struct>()
.s<&my_struct::section>("hi");
};
Возможно ли это, возможно, черезспециализация?Я не могу обернуть голову, как заставить это даже компилироваться, поскольку в настоящее время я не могу передать указатель на член, так как шаблонный тип Map стоит первым в объявлении, что дает мне следующее для clang:
примечание: шаблон кандидата игнорируется: недопустимый явно заданный аргумент для параметра шаблона 'Map'
И я не могу заставить магические заклинания специализации работать,либо:
template <auto FieldType, std::size_t Len>
constexpr const foo<Base> s(char const (§ion_name)[Len]) const;
template <
template <class, class> class Map,
typename SecType,
Map<std::string, SecType> Base::*Field,
std::size_t Len
>
constexpr const foo<Base> s<Field, Len>(char const (§ion_name)[Len]) const {
}
, что дает
ошибка: частичная специализация шаблона функции не разрешена
Возможно ли то, что я после?Стоит упомянуть c ++ 14 и далее - все в порядке.