【问题标题】:C++ Passing template's constructor value in template's parameterC ++在模板参数中传递模板的构造函数值
【发布时间】:2020-04-10 13:12:06
【问题描述】:

我正在尝试将一个类作为模板参数传递。但是这个类只有一个强制构造函数,我们必须传递一个整数值。所以我试图找到一种方法来初始化模板的构造函数参数。

#include <iostream>

template <class F>
class Class1 {
public:
    int i = 0;
    F f;
    Class1() { i = f.u; }
};

class Class2 {
public:
    int u = 5;
    Class2(int j) { u = j; }
};

int main() {
    Class1 <Class2>c;
    std::cout << c.i << std::endl;
}

当然,这给了我一个错误“Class2 没有合适的默认构造函数可用”。说我想传递不同的类,构造函数在 Class1 的模板中没有相同数量的参数,有没有办法初始化模板的构造函数?我正在寻找 Class1 c 之类的东西;

【问题讨论】:

  • Class1 的目的是什么?目前看起来它只是包装了一个F 实例,然后保存了它的一个数据成员的另一个副本,这似乎毫无意义。

标签: c++ templates initialization


【解决方案1】:

Class1 c; 无法作为通用解决方案。如果不同的Fs 会有不同的构造函数,你需要在某处指定传递给该构造函数的内容。

一种似乎有意义的方法是将参数从Class1s 构造函数转发到F

如果F 有默认构造函数,您将能够构造Class1 而无需传递任何内容。

#include <iostream>

template <class F>
class Class1 {
public:
    int i = 0;
    F f;
    template <typename... Args>
    Class1(Args&&... args) : f(std::forward<Args>(args)...) { i = f.u; }
};

class Class2 {
public:
    int u = 5;
    Class2(int j) { u = j; }
    Class2() = default;
};

int main() {
    Class1<Class2> c(10);
    Class1<Class2> c2;
    std::cout << c.i << " " << c2.i << std::endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多