Скажите, у меня есть шаблон, который специализируется на несколько типов, TypeMathcer
, в котором есть type
участник.Как специализировать шаблон на произвольном зависимом типе
#include <memory>
#include <vector>
template <typename T>
struct TypeMatcher;
template <typename T>
struct TypeMatcher<T *>
{
// making some type from T
typedef std::shared_ptr<T> type;
};
template <typename T>
struct TypeMatcher<T&>
{
// making other type from T
typedef std::vector<T> type;
};
Теперь я хочу, чтобы создать еще один шаблон и специализировать его для типов, которые я получаю от TypeMatcher
. Если я делаю это просто, как этот
template <typename T>
struct MyNeedfullTemplate;
template <typename T>
struct MyNeedfullTemplate<typename TypeMatcher<T>::type>
{
};
Я получаю ошибку компиляции: template parameters not deducible in partial specialization
.
же ошибка, если использовать using
синтаксис
template <typename T>
using type_matcher_t = typename TypeMatcher<T>::type;
template <typename T>
struct MyNeedfullTemplate;
template <typename T>
struct MyNeedfullTemplate<type_matcher_t<T> >
{
};
Я прочитал ответ на вопрос partial specialization for iterator type of a specified container type, который очень похож на мой вопрос, но все еще не уверен, что если существующие одного контрпример делает весь вопрос бессмысленным. Также у нас есть совершенно новые стандарты C++ 14 и C++ 17, которые могут изменить ситуацию. Итак, что, если я гарантирую, что специализации уникальны и существуют, будут ли какие-либо возможности сделать параметры выводимыми?
ОК, я вижу. Но существует ли какой-либо общий шаблон для замены такого шаблона?Что-то вроде черт или, может быть, другое, чего я не знаю. – user2807083
@ user2807083 Я добавил потенциальное решение (предполагая, что я правильно понял ваш случай использования). – Angew
О, это так. Я подозревал, что есть какое-то решение. – user2807083