【发布时间】:2017-05-29 00:32:38
【问题描述】:
我想创建将 ClassType 及其构造函数参数作为模板参数的对象创建者类。
在基本情况下,我的代码如下所示:
template<typename ClassType, typename ... Args>
class ClassCreator : public ClassType
{
std::tuple<Args ...> args_;
public:
template <typename std::enable_if<sizeof...(Args)!=0>::type>
ClassCreator(Args ... args) : args_(std::make_tuple(args ...)), ClassType(args ...){}
template <typename std::enable_if<sizeof...(Args)==0>::type>
ClassCreator() : ClassType(){}
template <typename std::enable_if<sizeof...(Args)!=0>::type>
ClassType getObject() const
{
return ClassType(std::get<sizeof...(Args)>(args_) ... );
}
template <typename std::enable_if<sizeof...(Args)==0>::type>
ClassType getObject() const
{
return ClassType();
}
};
使用std::enable_if 保护以避免std::get<0> 来自空tuple。
我将它与示例类一起使用:
class A
{
public:
A(){}
A(int firstInt, int secondInt){}
};
int main()
{
ClassCreator<A> creatorATrivial();
ClassCreator<A, int, int> creatorA(1, 2);
A aTrivial = creatorATrivial.getObject();
A a = creatorA.getObject();
}
我得到了大量的错误。
我是否正确理解 sizeof... 运算符?
std::get<sizeof...(Args)>(args_) ... 是解压tuple 的有效方法吗?
【问题讨论】:
标签: c++ c++11 variadic-templates sfinae