gpt4 book ai didi

c++ - 遍历多种类型

转载 作者:太空狗 更新时间:2023-10-29 20:14:35 26 4
gpt4 key购买 nike

假设我想用 vector<int> 测试一些东西, vector<bool> , vector<string> .我想写这样的东西:

for(type T in {int, bool, string}){
vector<T> v;
for(int i = 0; i < 3; ++i){
v.push_back(randomValue<T>());
}
assert(v.size() == 3);
}

我知道该语言中没有这样的功能,但是否可以通过某种方式进行模拟?在某些库中是否有此功能,例如 boost

最佳答案

提升.MPL

可以用类型列表来完成——它们在Modern C++ Design: Generic Programming and Design Patterns Applied中有详细讨论。作者:Andrei Alexandrescu

检查 Boost.MPL图书馆。例如 - boost::mpl::for_each

LIVE DEMO

#include <boost/exception/detail/type_info.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/vector.hpp>
#include <iostream>
#include <cassert>
#include <vector>
#include <string>

using namespace boost;
using namespace std;

template<typename T>
T randomValue()
{
return T();
}

struct Benchmark
{
template<typename T>
void operator()(T) const
{
cout << "Testing " << type_name<T>() << endl;
vector<T> v;
for(int i = 0; i < 3; ++i)
{
v.push_back(randomValue<T>());
}
assert(v.size() == 3);
}
};

int main()
{
mpl::for_each<mpl::vector<int, bool, string>>(Benchmark());
}

输出是:

Testing int
Testing bool
Testing std::string

C++11 可变参数模板

另一种选择是使用 C++11 可变参数模板:

LIVE DEMO

#include <boost/exception/detail/type_info.hpp>
#include <iostream>
#include <cassert>
#include <vector>
#include <string>

using namespace boost;
using namespace std;

template<typename T>
T randomValue()
{
return T();
}

struct Benchmark
{
template<typename T>
void operator()(T) const
{
cout << "Testing " << type_name<T>() << endl;
vector<T> v;
for(int i = 0; i < 3; ++i)
{
v.push_back(randomValue<T>());
}
assert(v.size() == 3);
}
};

template<typename ...Ts,typename F>
void for_each(F f)
{
auto &&t = {(f(Ts()),0)...};
(void)t;
}

int main()
{
for_each<int, bool, string>(Benchmark());
}

关于c++ - 遍历多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869636/

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