在 boost::mpl::for_each() 中调用通用 lambda
Calling a generic lambda in boost::mpl::for_each()
这里的一些答案(How to loop through a boost::mpl::list? 是我开始的那个)暗示我应该能够构建一个通用的 lambda 来提供给 boost::mpl::for_each() 但我无法找到一个工作示例,或者自己构建一个。
理想情况下,我希望能够在 lambda 中执行的操作是采用类似
的函数
template<typename T>
void TestFunction(const int &p)
{
T t(p);
std::cout << "p = " << p << ", t = " << t << std::endl;
};
我目前正在循环调用
for(int k = 0; k < 2; ++k)
{
TestFunction<int>(k);
TestFunction<long>(k);
TestFunction<float>(k);
TestFunction<double>(k);
};
并将其替换为
typedef boost::mpl::list<int, long, float, double> ValidTypes;
for(int k = 0; k < 2; ++k)
{
// lambda definition that captures k
// boost::mpl::for_each(ValidTypes, ...) that calls the lambda.
};
这可能吗?如果不使用 for_each() 和其他 mpl 构造之一?我有一个版本的代码 运行,我在其中重载了 operator() 但如果可能的话,我希望看到一个 lambda 解决方案。
谢谢,
安迪.
如果可以使用 C++14 的通用 lambda,则可以捕获 p
的值,还可以推断传递给 lambda 的当前有效类型的类型:
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/list.hpp>
#include <iostream>
int main()
{
using ValidTypes = boost::mpl::list<int, long, float, double>;
for (auto k = 0; k < 2; ++k) {
boost::mpl::for_each<ValidTypes>([p = k](auto arg) {
using T = decltype(arg);
T t(p);
std::cout << "p = " << p << ", t = " << t << '\n';
});
}
}
编辑:为了加分,这里有一个稍微更高级的版本,它也适用于非默认可构造类型:
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/list.hpp>
#include <iostream>
class NonDefaultConstructible
{
int value;
public:
NonDefaultConstructible(int const& p) : value(p) {}
friend auto& operator<<(std::ostream& ostr, NonDefaultConstructible const& ndc)
{
return ostr << ndc.value;
}
};
int main()
{
using ValidTypes = boost::mpl::list<int, long, float, double, NonDefaultConstructible>;
for (auto k = 0; k < 2; ++k) {
boost::mpl::for_each<ValidTypes, boost::mpl::make_identity<boost::mpl::_1>>([p = k](auto arg) {
using T = typename decltype(arg)::type;
T t(p);
std::cout << "p = " << p << ", t = " << t << '\n';
});
}
}
有关 make_identity
的复杂用法的解释,请参阅我的 very first Q&A 此处!
这里的一些答案(How to loop through a boost::mpl::list? 是我开始的那个)暗示我应该能够构建一个通用的 lambda 来提供给 boost::mpl::for_each() 但我无法找到一个工作示例,或者自己构建一个。
理想情况下,我希望能够在 lambda 中执行的操作是采用类似
的函数template<typename T>
void TestFunction(const int &p)
{
T t(p);
std::cout << "p = " << p << ", t = " << t << std::endl;
};
我目前正在循环调用
for(int k = 0; k < 2; ++k)
{
TestFunction<int>(k);
TestFunction<long>(k);
TestFunction<float>(k);
TestFunction<double>(k);
};
并将其替换为
typedef boost::mpl::list<int, long, float, double> ValidTypes;
for(int k = 0; k < 2; ++k)
{
// lambda definition that captures k
// boost::mpl::for_each(ValidTypes, ...) that calls the lambda.
};
这可能吗?如果不使用 for_each() 和其他 mpl 构造之一?我有一个版本的代码 运行,我在其中重载了 operator() 但如果可能的话,我希望看到一个 lambda 解决方案。
谢谢, 安迪.
如果可以使用 C++14 的通用 lambda,则可以捕获 p
的值,还可以推断传递给 lambda 的当前有效类型的类型:
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/list.hpp>
#include <iostream>
int main()
{
using ValidTypes = boost::mpl::list<int, long, float, double>;
for (auto k = 0; k < 2; ++k) {
boost::mpl::for_each<ValidTypes>([p = k](auto arg) {
using T = decltype(arg);
T t(p);
std::cout << "p = " << p << ", t = " << t << '\n';
});
}
}
编辑:为了加分,这里有一个稍微更高级的版本,它也适用于非默认可构造类型:
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/list.hpp>
#include <iostream>
class NonDefaultConstructible
{
int value;
public:
NonDefaultConstructible(int const& p) : value(p) {}
friend auto& operator<<(std::ostream& ostr, NonDefaultConstructible const& ndc)
{
return ostr << ndc.value;
}
};
int main()
{
using ValidTypes = boost::mpl::list<int, long, float, double, NonDefaultConstructible>;
for (auto k = 0; k < 2; ++k) {
boost::mpl::for_each<ValidTypes, boost::mpl::make_identity<boost::mpl::_1>>([p = k](auto arg) {
using T = typename decltype(arg)::type;
T t(p);
std::cout << "p = " << p << ", t = " << t << '\n';
});
}
}
有关 make_identity
的复杂用法的解释,请参阅我的 very first Q&A 此处!