我试图找出一种方法来使用Boost :: MPL生成一个typename,它是模板参数和字符串的串联。
我有一对名为X
和XProvider
的类。后者是一个工厂类,它实例化从前一类继承的对象。
模板类用于在运行时管理类型的实例化:除其他外,它包含unordered_map和其他一些misc。成员。
我最终想要实现的是一个看起来像这样的元函数:
鉴于课程
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>
是一个返回类型名称TProvider的元函数。
基于this answer,我认为元函数应该看起来像这样:
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 ++模板,我可能会做这个工作,但我真的喜欢避免这种情况,如果 at all 可能的话。
我真的很感激任何建议。
Thanks- 什穆埃尔
答案 0 :(得分:2)
好吧,你不能通过使用模板参数连接字符串来获取类型名称,但如果你的意图是......
我想要一个元函数Get_Provider_Type :: type,它将为我返回类型fooProvider
您只需在foo
中定义类型:
struct foo {
using provider = fooProvider;
};
如果您需要,可以实施适用于定义T::provider
template<class T>
struct Get_Provider_Type {
using type = typename T::provider;
};
如果您无法修改foo
来定义类型,那么这将非常有用。然后,您可以专门设置Get_Provider_Type
:
template<>
struct Get_Provider_Type<foo> {
using type = fooProvider;
};