在C ++标准库中,是否存在integral_constant<bool, X>
上的布尔操作的模板类型(其中X
是true
还是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 ++标准库中是否已经存在这样的类型?
答案 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中。