是否可以定义std::vector<std::any> vec
。
https://www.bfilipek.com/2018/06/any.html#message-passing //您可以在容器中使用它:
std::map<std::string, std::any> m;
m["integer"] = 10;
m["string"] = std::string("Hello World");
m["float"] = 1.0f;
std::vector<std::any> vec;
我们可以有类似的东西
class a
{
int val;
}
class b
{
float val;
}
vec.emplaceback(a);
vec.emplaceback(b);
答案 0 :(得分:0)
答案 1 :(得分:0)
是的,我有一个示例可用于将可变参数模板包转换为运行时。它并不会对传递的参数进行复制,并且会在每次传递时擦除向量,但并未对其进行优化,但是它演示了这一想法(实际上,您将使用for
循环和std::ref<>
):
template<typename ... many>
void safe_printf(const char *s, many ... args)
{
using namespace std;
vector<any> a = {args ...};
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
if (a.empty())
throw std::logic_error("Fewer arguments provided to printf");
if (a[0].type() == typeid(string)) cout << any_cast<string>(a[0]);
if (a[0].type() == typeid(int)) cout << any_cast<int>(a[0]);
if (a[0].type() == typeid(double)) cout << any_cast<double>(a[0]);
a.erase(a.begin());
s++;
}
}
cout << *s++;
}
}
int main()
{
safe_printf("Hello % how are you today? I have % eggs and your height is %","Jack"s, 32,5.7);
// Hello Jack how are you today? I have 32 eggs and your height is 5.7
}
当然是std::any
本身不是模板,但是它依赖于运行时检查来查看其存储的指针类型。