请教大佬们一个 c++的模板的问题。

2022-06-29 10:17:47 +08:00
 opiviqo
1.定义一个类模板 A;
template <typename typeA> class A{};


2.定义一个类 B ,初始化需要参数 x,y;
class B{
B(int x,int y);
};
3.然后用 B 类去套模板:
A<B> a;
4.问题:B 套模板的时候,该如何初始化参数 x ,y 呢?
2037 次点击
所在节点    C++
12 条回复
SJ2050cn
2022-06-29 10:26:00 +08:00
你既然把 B 当成 A 的模板参数,那么 A 类里面应该有 B 类型的属性,可以在 A 类构造函数的初始化列表中对该属性进行初始化,或者你只是在 A 类中的方法中用到了 B 类型的形参,那 B 类型应该在调用 A 类方法前初始化的。
newmlp
2022-06-29 10:27:24 +08:00
B 类怎么初始化,套模板后还是怎么初始化啊
opiviqo
2022-06-29 10:28:58 +08:00
@newmlp 如果按我你不给 b 参数 会编译不过;
newmlp
2022-06-29 10:41:11 +08:00
@opiviqo 原来:B b(1,2)
现在:A<B> a(1,2)
ysc3839
2022-06-29 10:53:23 +08:00
请发完整代码
stein42
2022-06-29 11:13:42 +08:00
利用模版构造函数和可变长模版参数,按 C++ 11 标准可编译。

```
template<typename T>
class A {
public:
T t;

template<typename ...ARGS>
A(ARGS... args) : t{args...} {}
};

class B {
public:
B(int x, int y) {}
};

A<B> a{1, 2};
```
stein42
2022-06-29 11:30:50 +08:00
如果 B 的构造函数有引用参数,还需要用到 std::forward 。
opiviqo
2022-06-29 11:56:34 +08:00
@ysc3839
template <typename typeA> class A{
void Operation(double value) {
type_a.Algorithm(value);
}

private:
typeA type_a;
};

class B{
public:
B(int x1,int y1):x(x1),y(y1){}
int x;
int y;
void Algorithm(double value){
;
}
};

int main(){
A<B> a;
}
leimao
2022-06-30 08:21:29 +08:00
```
template <typename typeA> class A{

A(int x1,int y1) : type_a{x1, y1} {}

void Operation(double value) {
type_a.Algorithm(value);
}

private:
typeA type_a;
};
```
leimao
2022-06-30 08:27:33 +08:00
如果是更 general 的 use case ,你需要用到 perfect forwarding 。你可以看一下:
https://leimao.github.io/blog/Universal-Reference-Perfect-Forwarding/
FrankHB
2022-06-30 08:56:58 +08:00
问题不成立。
A<B>里的构造函数直接取决于 A 的定义,而不一定依赖 B 。你不给 A 的明确定义,这个问题就无解,上面的多数回答也就是在这个基础上瞎蒙(假定 A 的构造函数里会初始化 B )。
有没有依赖 B 的构造函数都是个问题,就更别说有没有依赖签名为(int, int)的这个重载了。
segmentlll
2022-07-14 17:22:54 +08:00
B 实例化的时候才会调用构造函数,你想想自己什么时候实例化? A<B> 这里只是告诉编译器找 type 是 B 的模板实现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/862853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX