gpt4 book ai didi

c++ - 是否可以遍历模板参数?

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:52 26 4
gpt4 key购买 nike

我有这样的代码:

template <typename T1,
typename T2 = void,
typename T3 = void,
typename T4 = void,
typename T5 = void>
std::set<std::type_info const*> MyClass<T1,T2,T3,T4,T5>::get_types()
{
std::set<std::type_info const*> t;
t.push_back(&typeid(T1));
if(typeid(T2) != typeid(void))
t.push_back(&typeid(T2));
else
return;
if(typeid(T3) != typeid(void))
t.push_back(&typeid(T3));
else
return;
if(typeid(T4) != typeid(void))
t.push_back(&typeid(T4));
else
return;
if(typeid(T5) != typeid(void))
t.push_back(&typeid(T5));
else
return;
}

有没有办法在模板类型 T2T5 之间进行循环以避免冗余代码?

注意:我不使用 C++11。我使用 boost。

最佳答案

是的,您可以使用 Boost MPL使用 boost::mpl::vector 的设施和 boost::mpl::for_each像下面的例子:

Live Demo

代码:

#include <iostream>
#include <typeinfo>
#include <vector>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/placeholders.hpp>

template <typename T>
struct wrap {};

class Bar {
std::vector<std::type_info const*> &types;
public:
Bar(std::vector<std::type_info const*> &types_) : types(types_) {}
template<typename T> void operator()(wrap<T>) const {
if(typeid(T) != typeid(void)) types.push_back(&typeid(T));
}
};

template<typename T1, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void>
struct Foo {
std::vector<std::type_info const*> get_types() const {
std::vector<std::type_info const*> out;
boost::mpl::for_each<boost::mpl::vector<T1, T2, T3, T4, T5>, wrap<boost::mpl::placeholders::_1> >(Bar(out));
return out;
}
};

int main() {
Foo<int, long, double> foo;
std::vector<std::type_info const*> types = foo.get_types();

for(int i(0), isz(types.size()); i < isz; ++i) {
std::cout << types[i]->name() << std::endl;
}
}

关于c++ - 是否可以遍历模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453874/

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