类是否可以公开参数包?

时间:2016-05-04 02:41:40

标签: c++ variadic-templates

我是一家工厂" M"。我需要建立一个班级" C"。包含我的班级' M'的开发人员希望能够调用' M :: getInst()',并且拥有一个正确构造的' C&#39 ;

另外,我想要' C'能够与我们一起工作,除了提供一个公共构造函数之外什么都不做,以及一个告诉我的班级的单一辅助方法' M'如何查找/调用该构造函数。

这可能吗?以下是我原则上要做的事情。问题是我在C ++中没有办法编写方法" types()"。似乎不可能将类型(甚至一个!)作为值返回。

struct C {
    String s; Blob b;
    C( String a, Blob b ) : s(a), b(b) {}
    typelist types() {
        return { String, Blob };
    }
};

clas M {
    template<typename T>
    T* getInst() {
        return getInst_imp<T::types()>();
    };

    template<class... Ks>
    T* getInst_imp() {
        return T( getValue(Ks)... );
    }
};

用户将称之为:

C* instance = M::getInst<C>();

原因在于,&#39; C&#39;是由一组固定的组件类型的组件构建的。我的班级&#39; M&#39;是如何初始化它们的权威。所以有意义的是,每当开发人员想要创造一种新的C风格时,为什么要重新发明所有现有的轮子呢?他们应该告诉M&#39;他们需要什么组件。但是怎么做呢?

2 个答案:

答案 0 :(得分:1)

您现在可以做的最好的事情是std::tuple

using typelist = std::tuple<String, Blob>;
typelist types() {
    return typelist(s, b);
}

根据您的工作,可能会更好地作为tuple引用。

答案 1 :(得分:1)

Eric Niebler suggests类型列表应定义为:

// A class template that is just a list of types:
template <class... T> struct typelist { };

您可以在课程C上公开:

struct C {
    String s;
    Blob b;
    C( String a, Blob b ) : s(a), b(b) {}
    using types = typelist<String, Blob>;
};

然后我们可以借用Eric的Tiny Metaprogramming Library中的一些技术来使用工厂内的类型列表:

template<typename T, typename List>
struct MImpl;

template<typename T, typename ...Ks>
struct MImpl<T, typelist<Ks...>> {
    static T getInst() {
        return T(getValue<Ks>()...);
    }
};

class M {
public:
    template<typename T>
    T getInst() {
        return MImpl<T, typename T::types>::getInst();
    }
};

Live demo