Я пытаюсь выяснить способ использования Boost :: MPL для генерации имени типа, который является конкатенацией параметра шаблона и строки.Создание C++ typename путем конкатенации параметра шаблона со строкой
У меня есть пары классов, которые называются: X
и XProvider
. Последний - фабричный класс, который создает объекты, унаследованные от прежнего типа.
Класс шаблона предназначен для управления созданием типов во время выполнения: он содержит, помимо прочего, unordered_map и некоторые другие разное. члены.
То, что я в конечном счете пытается достичь, это metafunction, который выглядит примерно так:
Учитывая класс
template <typename T>
class Plugin_Manager{
using Base_Type = T;
std::vector<Get_Provider_Type<Base_Type>::type *> m_provider_collection;
*/ ... /*
};
Где Get_Provider_Type<T>
является metafunction, который возвращает TYPENAME TProvider.
на основе this answer, я думаю, что metafunction должен выглядеть по линии этого:
template < typename Str1, typename Str2 >
struct concat : boost::mpl::insert_range < Str1, typename boost::mpl::end<Str1>::type, Str2 > {};
template <class T> struct Get_Provider_Type{
typedef typename boost::mpl::string<boost::mpl::c_str<T>::value>::type Base_Name;
typedef boost::mpl::string<'Prov', 'ider'> Suffix;
typedef typename concat<Base_Name, Suffix>::type type;
};
Однако, я действительно не понимая mpl::c_str
или mpl::string
или их правильное использование, и я не могу следовать за ошибки сообщения, которые я получаю. Код, как написано выше, дает мне сообщение об ошибке:
error C2039: 'value_type' : is not a member of 'foo'
(Foo здесь будучи шаблон аргумент - Plugin_Manager<foo>
)
Я понимаю, что, вероятно, может сделать эту работу, если я использую большой макрос, а не C++, но я бы действительно хотел бы избежать этого, если вообще возможно.
Я бы очень признателен за любые предложения.
Шмуэль Благодарения и
Макросы являются единственным способом создания новых идентификаторов путем объединения существующих, извините. Шаблоны не могут этого сделать. –
То, что вы говорите, не имеет для меня большого смысла. Если вы намерены использовать выражение 'Get_provider_Type :: type', чтобы указать аргумент шаблона для вектора, вам нужно только указать тип. Вам вообще не нужно генерировать имя для него. –
pmr
Возможно, _generate_ - неправильный термин. 'Plugin_Manager' должен содержать 'std :: vector ' - Я хотел бы иметь metafunction 'Get_Provider_Type :: type', который вернет мне тип' fooProvider', но я не знаю, как напишите это metafunction (или даже если это возможно - за комментарий @ MarkRansom выше). –