首页 文章

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

提问于
浏览
1

我试图找出一种方法来使用Boost :: MPL生成一个typename,它是模板参数和字符串的串联 .

我有一对名为 XXProvider 的类 . 后者是一个工厂类,它实例化从前一类继承的对象 .

模板类用于在运行时管理类型的实例化:除其他外,它包含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_strmpl::string 或他们的正确用法,我无法按照我收到的错误消息 . 上面的代码给出了错误消息:

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

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

我意识到如果我使用一个大的宏而不是c模板,我可能会做这个工作,但我会 really 喜欢避免这种情况,如果 at all 可能的话 .

我真的很感激任何建议 .

谢谢 - Shmuel

1 回答

  • 2

    好吧,你不能通过使用模板参数连接字符串来获取typename,但如果你的意图是...

    我想要一个元函数Get_Provider_Type :: type,它将为我返回类型fooProvider

    您可以在 foo 中简单地定义类型:

    struct foo {
        using provider = fooProvider;
    };
    

    如果您需要它,您可以实现"metafunction",它将适用于定义 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;
    };
    

相关问题