【发布时间】:2016-10-07 10:06:23
【问题描述】:
我有一些像下面这样的模板类
template<typename T>
class A{
public:
A(T a0, T a1, T a2):a0_(a0),a1_(a1),a2_(a2){}
private:
T a0_,a1_,a2_;
};
template<typename T>
class B{
public:
B(T a, std::vector<T> b):a_(a),b_(b){}
private:
T a_;
std::vector<T> b_;
};
template<typename T>
class C{
public:
C(T a, T b, std::vector<T> c):a_(a),b_(b),c_(c){}
private:
T a_,b_;
std::vector<T> c_;
};
一般来说,类构造函数有任意数量的参数,最后是可选的std::vector。
我希望创建一个 getter 函数来分配上述类的实例。
template< typename C, typename... Args>
C* get(Args... args){
return new C(args...);
}
当显式创建/定义向量时,getter 函数编译成功。
A<int>* aa = get< A<int> >(1,2,3);
std::vector<int> v({1,2,3});
B<int>* bb = get< B<int> >(1,v);
C<int>* cc = get< C<int> >(1,2,v);
B<int>* bb = get< B<int> >(1,std::vector<int>({1,2,3}));
C<int>* cc = get< C<int> >(1,std::vector<int>({1,2,3}));
为了简单起见,我想使用初始化列表来定义B 和C 中的向量。这在直接调用构造函数时可以正常工作。
A<int>* aa = new A<int>(1,2,3);
B<int>* bb = new B<int>(1,{1,2,3});
C<int>* cc = new C<int>(1,2,{1,2,3});
getter 函数却给出了编译错误
B<int>* bb = get< B<int> >(1,{1,2,3});
C<int>* cc = get< C<int> >(1,2,{1,2,3});
错误:函数的参数太多'C* get(Args ...) [with C = B; Args = {}]'
创建一个像下面这样处理向量的函数特化也是不成功的。
template< typename C, typename T, typename... Args>
C* get(Args... args, std::vector<T> v){
return new C(args...,v);
}
是否可以创建一个 getter 函数,将参数包和初始化器列表作为最后一个参数并创建对象?
我使用 gcc 5.4 编译。
【问题讨论】:
-
如果您愿意成为第一,那很容易。否则会很复杂和/或不可能。
-
感谢@Yakk,但在我的真实来源中,函数是由我定义的。
-
@ztuk 我不明白那个回复。
-
对不起!我的意思是类的构造函数是由我工作的项目中的其他开发人员定义的
标签: c++ c++11 templates variadic-templates initializer-list