Zac*_*ack 2 c++ templates using-declaration c++11
有没有办法将模板参数"捆绑"在一起以避免重复?
我有几个类和函数都使用相同的三个模板参数.拥有一次使用每个类/函数的函数并不罕见.结果代码非常快速地变得非常混乱.是否有更简洁的方法来编写此代码?
// ContextFactory is a pointer to functions that instantiate objects that are subtypes of MetricContext
template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
using ContextFactory = MetricContext <VertexID, EdgeMembershipType, SetBitmap> *(*)(const char *);
template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
static vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> buildCFList() {
vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> answer;
answer.push_back(MetricContext<VertexID, EdgeMembershipType, SetBitmap>::template make<NeoContext<VertexID, EdgeMembershipType, SetBitmap >>);
return answer;
};
Run Code Online (Sandbox Code Playgroud)
请注意,此函数的近一半是字符串的重复<VertexID, EdgeMembershipType, SetBitmap>>,但每次使用此字符串都适用于不同的类或函数,因此我认为别名不起作用.
(如果它有帮助,这个函数的目的是创建一个指向函数的指针数组,这些函数将创建作为子类型的子对象的对象 MetricContext<VertexID, EdgeMembershipType, SetBitmap>>
比@昆汀的是让你的模板一个较为具体的做法依赖于一个参数-预计将有类型定义 VertexID,EdgeMembershipType和SetBitmap.
// ContextFactory is a pointer to functions that instantiate objects that are
// subtypes of MetricContext
template<typename Types>
using ContextFactory = MetricContext <Types> *(*)(const char *);
template<typename Types>
static vector<ContextFactory<Types>> buildCFList() {
vector<ContextFactory<Types>> answer;
answer.push_back(MetricContext<Types>::template make<NeoContext<Types>>);
return answer;
};
Run Code Online (Sandbox Code Playgroud)
请注意,当您想要实际使用其中一个typedef时,您需要使用例如:typename Types::VertexID.
(理想情况下,您会想出一个比Types模板参数更好的名称.)