ClassTypeとそのコンストラクタ引数をテンプレート引数として受け取るオブジェクト作成者クラスを作成したいと思います。空tuple
からstd::get<0>
を避けるために、守ってstd::enable_if
でバリデーションテンプレートの存在に基づくstd :: enable_if
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();
}
};
:
基本的に私のコードは次のようになります。
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...
オペレータが正しく理解していますか? tuple
を開梱するにはstd::get<sizeof...(Args)>(args_) ...
が有効ですか?