gpt4 book ai didi

c++ - 与 boost::mpl 占位符评估不一致的行为

转载 作者:可可西里 更新时间:2023-11-01 18:35:54 26 4
gpt4 key购买 nike

在下面的代码中(为演示而简化):

  namespace mpl = boost::mpl;

using if1 = mpl::if_<std::is_same<double, mpl::_1>, double, void>;
//using if2 = mpl::if_<std::is_same<double, mpl::_1>, typename std::common_type<double, mpl::_1>::type, void>;

using apply1 = boost::mpl::apply<if1, double>::type;
//using apply2 = boost::mpl::apply<if2, double>::type;

std::is_same<double, mpl::_1> , 占位符被正确替换为 double ,就好像实例化是显式的 std::is_same<double, double>这会导致正确/预期的行为。

然而,在std::common_type<double, mpl::_1> ,占位符被替换,就好像实例化是明确的std::common_type<double, mpl_::arg<1>> ,这会导致以下错误,因为显然没有“通用”类型:

error: incompatible operand types ('double' and 'mpl_::arg<1>')


问题:为什么 mpl::_1占位符正确转换/替换为 doublestd::is_same , 但不std::common_type ?有解决方法吗?


最佳答案

您通过访问嵌套的 ::type 来强制实现过于急切的实例化的 std::common_type在应用 lambda 之前。替换 typename std::common_type<double, mpl::_1>::typestd::common_type<double, mpl::_1>你应该一切都好。

编辑:为糟糕的建议道歉。我不太明白你在做什么。麻烦的是mpl::apply将首先通过 mpl::lambda 运行它,将您的占位符表达式转换为 lambda 表达式.这将导致 std::common_type<double, mpl::_1>包裹在 mpl::protect 中,这将阻止它在第一遍中被评估,并且 mpl::if_不会在第二遍中评估它,因为它将其第二个和第三个参数视为普通类型,而不是占位符表达式。您可以使用 mpl::bind给力std::common_type之前进行评估mpl::if_ .这样,mpl::if_看到 if_<some-condition, double, void> , 一切又都好了。

#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/bind.hpp>
#include <boost/mpl/quote.hpp>

namespace mpl = boost::mpl;

template<typename T, typename U> using common_type2 = std::common_type<T,U>;
using if2 = mpl::if_<
std::is_same<double, mpl::_1>,
mpl::bind<mpl::quote2<common_type2>, double, mpl::_1>,
void>;
using apply2 = boost::mpl::apply<if2, double>::type;
static_assert(std::is_same<apply2, double>::value, "works");

喂!

关于c++ - 与 boost::mpl 占位符评估不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19797014/

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