对任意数量的 类 使用可变模板参数
Using variadic template arguments for arbitrary number of classes
我遇到的情况是,我需要一个 class FaceProp
那个 maintains/holds 其他 class 的实际面部类型。这些可以是任何类型的面,如边界面、实体面、内部面等。我想使用 C++ 中的可变参数包功能来实现 FaceProp
,但我不确定如何实现。
我正在尝试以下主要 class
template<typename... FaceTypes>
class FaceProp
{
FaceProp(){
/// here construct all those template argument classes.
}
private:
// declare here the classes to the FaceTypes.
// e.g. If this class was declared with two face types I would have :
// std::unique_ptr<FaceType1> type1;
// std::unique_ptr<FaceType2> type2;
}
我不确定声明这些将如何工作,因为在实施时我不知道我需要处理多少/以及哪些面部类型。这是通过编译时间知道的。换句话说,当我想声明 class FaceProp
时,我会知道要使用多少种面部类型
例如
std::unique_ptr<FaceProp<facetype1, facetype2>> allfaces;
如何最好地实现这一目标?
如何使用评论中建议的 std::tuple
执行此操作的示例。我展示了有无 std::unique_ptr
.
template <typename... FaceTypes>
class FaceProp
{
FaceProp() {
m_tuple = {FaceTypes()...};
m_uniqueTuples = {std::make_unique<FaceTypes>()...};
}
private:
std::tuple<FaceTypes...> m_tuple;
std::tuple<std::unique_ptr<FaceTypes>...> m_uniqueTuples;
};
代码中的...
扩展了关联表达式,将每个类型包含在参数包中。因此,FaceProp<int, double>
扩展为:
class FaceProp
{
FaceProp() {
m_tuple = {int(), double()};
m_uniqueTuples = {std::make_unique<int>(), std::make_unique<double>()};
}
private:
std::tuple<int, double> m_tuple;
std::tuple<std::unique_ptr<int>, std::unique_ptr<double>> m_uniqueTuples;
};
我遇到的情况是,我需要一个 class FaceProp
那个 maintains/holds 其他 class 的实际面部类型。这些可以是任何类型的面,如边界面、实体面、内部面等。我想使用 C++ 中的可变参数包功能来实现 FaceProp
,但我不确定如何实现。
我正在尝试以下主要 class
template<typename... FaceTypes>
class FaceProp
{
FaceProp(){
/// here construct all those template argument classes.
}
private:
// declare here the classes to the FaceTypes.
// e.g. If this class was declared with two face types I would have :
// std::unique_ptr<FaceType1> type1;
// std::unique_ptr<FaceType2> type2;
}
我不确定声明这些将如何工作,因为在实施时我不知道我需要处理多少/以及哪些面部类型。这是通过编译时间知道的。换句话说,当我想声明 class FaceProp
时,我会知道要使用多少种面部类型
例如
std::unique_ptr<FaceProp<facetype1, facetype2>> allfaces;
如何最好地实现这一目标?
如何使用评论中建议的 std::tuple
执行此操作的示例。我展示了有无 std::unique_ptr
.
template <typename... FaceTypes>
class FaceProp
{
FaceProp() {
m_tuple = {FaceTypes()...};
m_uniqueTuples = {std::make_unique<FaceTypes>()...};
}
private:
std::tuple<FaceTypes...> m_tuple;
std::tuple<std::unique_ptr<FaceTypes>...> m_uniqueTuples;
};
代码中的...
扩展了关联表达式,将每个类型包含在参数包中。因此,FaceProp<int, double>
扩展为:
class FaceProp
{
FaceProp() {
m_tuple = {int(), double()};
m_uniqueTuples = {std::make_unique<int>(), std::make_unique<double>()};
}
private:
std::tuple<int, double> m_tuple;
std::tuple<std::unique_ptr<int>, std::unique_ptr<double>> m_uniqueTuples;
};