我有几个类,我想创建它们的对象。每个对象都有不同的名称。与任何其他对象(可能是同一类型)区分。我想把制作对象的责任交给一个不同的函数,它接受{name, class type}元素的向量。假设我有两个结构体:
struct A { int i; };
struct B { int i; double d; };
struct Type
{
std::string name;
template<typename T>
T t;
template<typename T>
using type = decltype(t);
};
std::vector<Type> v{ {"ObjA1", A()}, {"ObjB", B()}, {"ObjA2", A()} };
void fun(std::vector<Type> vec)
{
// use vec to create objects
}
- 这可能实现吗?
- 结构
A
和B
实际上是类,由一些人提供外部框架。
我有几个类,我想让它们的对象....
这可能实现吗?
是的,在c++17中可以。既然你知道类型,我建议std::vector<Type<...>>
std::variant<A, B, ...>
作为模板参数。
这需要然而struct Type
是一个类模板。
template<typename T> struct Type
{
std::string name;
T t;
using type = decltype(t);
};
那么我们可以提供一个助手别名类型:
#include <variant>
// helper type alias for variats
template<typename... Ts>
using VariantsType = Type<std::variant<Ts...>>;
现在你可以写
std::vector<VariantsType<A, B, C>> v{
{"ObjA1", A{}}, {"ObjB", B{}}, {"ObjA2", A{}}
};
v.emplace_back(VariantsType<A, B, C>{"ObjA3", A{}});
v.emplace_back(VariantsType<A, B, C>{"ObjC1", C{}});
// ... so on
查看演示
如果您知道将使用什么类型,则可以使用variant。如果不能列出将要使用的类型,则可以使用任何类型。像
std::vector<std::any> example;
example.push_back(1);
example.push_back("1");
example.push_back(std::make_pair(1, "1"));