【发布时间】:2014-05-08 18:48:13
【问题描述】:
我试图从一堆我知道接口的类中继承,但是它们可能有非常不同的构造函数。为此,我决定在派生类构造函数中使用可变参数模板,以便它可以获取最终馈送到父类的任意参数。
我的代码如下:
#include <iostream>
struct A {
A(int) { std::cout << "This is int\n"; }
A(unsigned) { std::cout << "This is unsigned\n"; }
};
struct B {
B(char) { std::cout << "This is char\n"; }
};
template <typename T>
struct C : public T {
template <typename... Args>
C(double, Args&&... params) : T(std::forward<Args>(params)...) { std::cout << "This is double\n"; }
// But what about this?
// C(Args&&... params, double) : T(std::forward<Args>(params)...) { std::cout << "This is double\n"; }
};
int main() {
C<A> p(1.0, 1);
C<A> r(1.0, 1u);
C<B> q(1.0, 'c');
// Which would work as following
// C<A> p(1, 1.0);
// C<A> r(1u, 1.0);
// C<B> q('c', 1.0);
return 0;
}
我的问题是:
- 此代码正确吗?这是我第一次尝试在构造函数中使用可变参数模板,所以如果我遗漏了什么,我很想听听您的意见。
- 我希望将子类
C的参数留在最后,但据我了解这是不可能的,因为在构造函数中不允许指定模板参数,在这种情况下可变参数会吞下所有参数,而没有给实际的孩子留下任何参数。有没有办法做到这一点?
【问题讨论】:
-
我的直觉是,这不是解决这个问题的最佳方法。你不能只接受适量的论点并做这样的事情吗:stackoverflow.com/questions/120876/….
-
@maxywb:但他不知道有多少个参数才是正确的参数个数,因为他是从模板参数派生的。
标签: c++ templates constructor variadic-templates argument-passing