Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有所表示类的相同构造函数签名的代理类模板_C++_Templates - Fatal编程技术网

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
具有虚拟函数,否则实际上不会。