integer_constant的编译时布尔运算?

时间:2017-05-11 10:03:49

标签: c++ templates c++14 compile-time compile-time-constant

在C ++标准库中,是否存在integral_constant<bool, X>上的布尔操作的模板类型(其中Xtrue还是false)?

作为一个简单的例子,你有一个函数的两个重载:

void foo_impl(false_type){
    cout << "false" <<endl;
}

void foo_impl(true_type){
    cout << "true" <<endl;
}

其中一个函数由另一个函数根据常量条件选择:

struct first_tag{};
struct second_tag{};
struct third_tag{};

template <typename TTag>
void foo(TTag role){
    foo_impl(typename constant_or<typename is_same<role, first_tag>::type, typename is_same<role, second_tag>::type>::type{});
}

在这种情况下,如果true的参数属于foo_impl()foo()类型,则会调用first_tag second_tag版本的constant_or使用假设类型constant_or

虽然编写我自己的var request = require('request'); function updateClient(postData){ var clientServerOptions = { uri: 'http://'+clientHost+''+clientContext, body: JSON.stringify(postData), method: 'POST', headers: { 'Content-Type': 'application/json' } } request(clientServerOptions, function (error, response) { console.log(error,response.body); return; }); } 版本很简单,但C ++标准库中是否已经存在这样的类型?

2 个答案:

答案 0 :(得分:2)

首先让我们解决您的拼写错误

template <typename TTag>
void foo(TTag){
    foo_impl(typename constant_or<typename is_same<TTag, first_tag>::type, typename is_same<TTag, second_tag>::type>::type{});
}

is_same类型的行为不起作用。

然后我们指出你可以使用is_same中的值。

template <typename TTag>
void foo(TTag){
    foo_impl(integral_constant<bool, is_same_v<TTag, first_tag> | is_same_v<TTag, second_tag>>{});
}

你已经完成了。也节省了大量的打字,这总是一个加号。

关于保存打字的说明(因为上帝保佑)

template<bool B>
using bool_constant = integral_constant<bool, B>;

由标准定义。

答案 1 :(得分:1)

它被称为routeCtr.addTo(map).on('routesfound', function (e) { distance = e.routes[0].summary.totalDistance; min = e.routes[0].summary.totalTime; }; 。类似的元函数,连接,析取,否定也出现在C ++ 17中。