C++ 具有所表示类的相同构造函数签名的代理类模板
如何对泛型/模板化代理类C++ 具有所表示类的相同构造函数签名的代理类模板,c++,templates,C++,Templates,如何对泛型/模板化代理类p进行编码,使其具有与某些表示类C相同的构造函数签名,并将这些参数从p转发到C,而无需任何运行时开销 (因为p是泛型的,C构造函数可以有任意数量和类型的参数,甚至没有) 示例代码: C类{ 公众: C(int i,string s,bool b,…/*各种数量和类型的参数,可能没有*/){ /* ... */ } /*其他方法*/ }; 模板 P类{ 公众: P(/*与T构造函数的参数相同*/){ //获取一个T实例 T(/*来自P构造函数的正向参数,未更改*/); /*
p
进行编码,使其具有与某些表示类C
相同的构造函数签名,并将这些参数从p
转发到C
,而无需任何运行时开销
(因为p
是泛型的,C
构造函数可以有任意数量和类型的参数,甚至没有)
示例代码:
C类{
公众:
C(int i,string s,bool b,…/*各种数量和类型的参数,可能没有*/){
/* ... */
}
/*其他方法*/
};
模板
P类{
公众:
P(/*与T构造函数的参数相同*/){
//获取一个T实例
T(/*来自P构造函数的正向参数,未更改*/);
/* ... */
}
/*其他方法*/
};
使用p:
P{/*C*/}所需的参数;
p、 一些_p_方法();
可以使用私有继承和使用关键字将构造函数从C
导入p
:
template<typename T>
class P : private T
{
public:
using T::T; // "Import" the T constructors
// ...
};
模板
P类:私人T
{
公众:
使用T::T;//“导入”T构造函数
// ...
};
请注意,如果您需要代理类p
在其自身的构造中包含一些特殊的初始化,则此方案将不起作用。您可以使用模板包创建一个构造函数模板,将参数完美地转发到C
。这样,您可以仅根据参数从同一个P
构造函数模板调用每个C
构造函数
#include <iostream>
#include <string>
#include <utility>
using std::cout;
using std::string;
class C {
public:
C(int i, string s, bool b,... /* assorted number and types of arguments, maybe none */) {
cout << i << '\n' << s << '\n' << b << '\n';
/* ... */
}
/* other methods */
};
template<typename T>
class P {
public:
template<typename ...Ts>
P(Ts &&...ts) {
// get a T instance
T t(std::forward<Ts>(ts)...);
/* ... */
}
void some_p_method() {}
/* other methods */
};
int main() {
P<C> p(1, string(), true);
p.some_p_method();
}
#包括
#包括
#包括
使用std::cout;
使用std::string;
C类{
公众:
C(int i,string s,bool b,…/*各种数量和类型的参数,可能没有*/){
这难道不会导致运行时开销吗?@Berk7871除非类C
具有虚拟函数,否则实际上不会。