当前位置:  开发笔记 > 编程语言 > 正文

检查是否在可变参数模板参数包中传递了类型

如何解决《检查是否在可变参数模板参数包中传递了类型》经验,为你挑选了1个好方法。

我听说过,使用新的C++ 1z语法,很容易检查是否在可变参数模板参数包中传递了一个类型 - 显然你可以使用接近一行长的代码来做到这一点.这是真的?那些相关的功能是什么?(我尝试通过折叠表达式查看但我无法看到如何在该问题中使用它们...)

以下是我在C++ 11中解决问题的方法,以供参考:

#include 


template
struct contains;

template
struct contains {
    static constexpr bool value = false;
};

template
struct contains {
    static constexpr bool value = std::is_same::value ? true : contains::value;
};

Praetorian.. 27

你在找std::disjunction.它在N4564 [meta.logical]中指定.

#include 

template
constexpr bool contains()
{ return std::disjunction_v...>; }

static_assert(    contains());
static_assert(    contains());
static_assert(    contains());
static_assert(not contains());

现场演示


或者,适应了 struct

template
struct contains : std::disjunction...>
{};

或者,使用折叠表达式

template
struct contains : std::bool_constant<(std::is_same{} || ...)>
{};

现场演示



1> Praetorian..:

你在找std::disjunction.它在N4564 [meta.logical]中指定.

#include 

template
constexpr bool contains()
{ return std::disjunction_v...>; }

static_assert(    contains());
static_assert(    contains());
static_assert(    contains());
static_assert(not contains());

现场演示


或者,适应了 struct

template
struct contains : std::disjunction...>
{};

或者,使用折叠表达式

template
struct contains : std::bool_constant<(std::is_same{} || ...)>
{};

现场演示


由于我们在17领域有折叠表达式,我们不妨只写`is_same_v`.
@qiubit`{}`*是* is_same`实例的直接列表初始化,换句话说,是构造它。[`is_same`](http://en.cppreference.com/w/cpp/types/is_same)具有一个隐式布尔转换操作符,该运算符继承自`integral_constant`,因此表达式产生布尔值。您也可以改写`std :: is_same <T,Ts> :: value`。
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有