gpt4 book ai didi

c++ - 如何用另一个模板作为参数初始化模板类?

转载 作者:行者123 更新时间:2023-11-28 01:20:28 25 4
gpt4 key购买 nike

我试图更好地理解 C++ 模板,但无法让下面的代码按我想要的方式工作。

#include <iostream>
template <typename T>
class Amount {
public:
T m_amount;

Amount(T amount) : m_amount(amount) {
//std::cout << __PRETTY_FUNCTION__ << "\n";
}

friend std::ostream &operator<<(std::ostream &out, const Amount &amount) {
out << amount.m_amount;
return out;
}
};

template <typename T>
class Grams : public Amount<T> {
public:
Grams(T amount) : Amount<T>(amount) {}
};

template <typename T>
class Milliliters : public Amount<T> {
public:
Milliliters(T amount) : Amount<T>(amount) {}
};


template <typename T>
class Ingredient {
public:
Amount<T> m_amount;
std::string m_name;
Ingredient(Amount<T> amount, std::string name) : m_amount(amount), m_name(name)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
std::cout << "Ingredient name: " << m_name << ", amount: " << m_amount << "\n";
}
};


class Bowl {
public:
Ingredient<Milliliters<int>> m_ingredient1;
Ingredient<Grams<int>> m_ingredient2;
Bowl(Ingredient<Milliliters<int>> ingredient1, Ingredient<Grams<int>> ingredient2) :
m_ingredient1(ingredient1),
m_ingredient2(ingredient2)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
std::cout << "Bowl with ingr1: " << m_ingredient1.m_name << ": " << m_ingredient1.m_amount << "\n";
std::cout << " ingr2: " << m_ingredient2.m_name << ": " << m_ingredient2.m_amount << "\n";
}
void Mix() {
std::cout << "Mixing all ingredients in the bowl\n";
}

};

int main() {

Milliliters<int> amount_water {10};
Milliliters<double> amount_milk {5.5};
Grams<double> amount_flour {5.6};
Grams<int> amount_butter {250};

std::string name_water { "water" };
std::string name_milk { "milk" };
std::string name_flour { "flour" };
std::string name_butter { "butter" };

Ingredient<Milliliters<int>> Water {amount_water, name_water};
Ingredient<Grams<int>> Butter {amount_butter, name_butter};

Bowl bowl1 {Water, Butter};

bowl1.Mix();

return 0;
}

如您所见,Bowl具有硬编码的可接受成分。我希望它也成为一个模板类,这样我就可以添加一个 Milk成分也是如此。

我以前有过这个:

template <typename T1, typename T2>
class Bowl {
public:
Ingredient<T1> m_ingredient1;
Ingredient<T2> m_ingredient2;
Bowl(Ingredient<T1> ingredient1, Ingredient<T2> ingredient2) :

[...]

Ingredient<Milliliters<double>> Milk {amount_milk, name_milk};
Ingredient<Grams<int>> Butter {amount_butter, name_butter};

Bowl<Ingredient<Milliliters<double>>, Ingredient<Grams<int>>> bowl1 {Milk, Butter};

但是那是说:

No matching constructor for initialization of 'Bowl<Ingredient<Milliliters<double> >, Ingredient<Grams<int> > >'

我在这里做错了什么,或者我没有正确理解什么?

最佳答案

template这可能很棘手,所以让我们想想你的 T1T2是。

Bowl<Ingredient<Milliliters<double>>, Ingredient<Grams<int>>>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ^~~~~~~~~~~~~~~~~~~~~^
T1 T2

由于您的 Bowl构造函数使用 Ingredient<T1>, Ingredient<T2> ,这扩展为:

Bowl<Ingredient<Ingredient<Milliliters<double>>>, Ingredient<Ingredient<Grams<int>>>>

关于c++ - 如何用另一个模板作为参数初始化模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com