通过将模板参数与字符串连接起来生成C++类型名



我正在尝试找出一种方法来使用Boost::MPL生成一个类型名,该类型名是模板参数和字符串的串联。

我有成对的类,分别命名为:XXProvider。 后者是一个工厂类,它实例化从前一种类型继承的对象。

模板类旨在管理运行时类型的实例化:它包含unordered_map和其他一些杂项成员。

我最终要实现的是一个元函数,看起来像这样:

给定类

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。

基于这个答案,我认为元函数应该看起来像这样:

    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_strmpl::string或其正确用法,并且我无法遵循我收到的错误消息。 上面写的代码给了我错误消息:

    error C2039: 'value_type' : is not a member of 'foo'

(foo这里是模板参数 - Plugin_Manager<foo>(

我意识到如果我使用大型宏而不是 c++ 模板,我可能会完成这项工作,但如果可能的话,我真的很想避免这种情况。

我真的很感激任何建议。

谢谢-什穆埃尔

好吧,您无法通过连接带有模板参数的字符串来获取类型名称,但是如果您的意图是......

我想要一个元函数 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;
};

相关内容

最新更新