计算可变参数模板元组中的 std::optional 类型

科斯莫

我有一个参数包保存为一些函数特征结构中的元组。我怎样才能知道这些参数中有多少是 std::optional 类型?

我尝试编写一个函数来使用折叠表达式检查每个参数,但这不起作用,因为我只传递了一个模板类型,即元组本身。

void foo1(){}
void foo2(int,float){}
void foo3(int, std::optional<int>, float, std::optional<int>){}
void foo4(int, std::optional<int>, bool){}

template<typename R, typename... TArgs>
struct ftraits<R(TArgs...)>
{
    using ret = R;
    using args = std::tuple<TArgs...>;
};

template<typename T>
struct is_optional : std::false_type
{
};

template<typename T>
struct is_optional<std::optional<T>> : std::true_type
{
};

template<typename... Ts>
constexpr auto optional_count() -> std::size_t
{
    // doesn't work since Ts is a single parameter with std::tuple<...>
    return (0 + ... + (is_optional<Ts>::value ? 1 : 0));
}

int main() {
    using t1 = typename ftraits<decltype(foo1)>::args;
    std::cout << optional_count<t1>() << std::endl; // should print 0
    using t2 = typename ftraits<decltype(foo2)>::args;
    std::cout << optional_count<t2>() << std::endl; // should print 0
    using t3 = typename ftraits<decltype(foo3)>::args;
    std::cout << optional_count<t3>() << std::endl; // should print 2
    using t4 = typename ftraits<decltype(foo4)>::args;
    std::cout << optional_count<t4>() << std::endl; // should print 1
}
康桓玮

您可以使用模板部分特化来获取元素类型tuple并重用折叠表达式

template<typename>
struct optional_count_impl;

template<typename... Ts>
struct optional_count_impl<std::tuple<Ts...>> { 
  constexpr static std::size_t count = 
    (0 + ... + (is_optional<Ts>::value ? 1 : 0));
};

template<typename Tuple>
constexpr auto optional_count() -> std::size_t {      
  return optional_count_impl<Tuple>::count;
}

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模板中 std::optional 的基础类型

可变参数模板,类型扣除和std :: function

std :: bind与可变参数模板和自动返回类型

检查某种类型是否是模板类std :: optional的实例

可变参数模板中的求和类型

迭代可变参数模板中的类型

返回类型std :: optional <std :: variant <... >>

创建从可变参数模板包派生的类型的元组

从具有可变参数模板构造函数的类型构造 std::function 对象

如何在C ++ 17中创建从可变参数模板推导的向量类型的元组?

std :: function中的可变参数模板参数匹配

std :: function的可变参数模板参数

非类型可变参数模板参数

可变参数模板继承中的类型不匹配

如何检查可变参数模板中的非原始类型?

配对从可变参数模板中随机获得的兼容类型

多维std :: array的可变参数模板

缺省类型的可变参数模板

可变参数模板类型推导

迭代可变参数模板类型

动态值的可变参数模板类型

将以可变参数模板参数为元素类型的std :: tuple传递给另一个函数作为参数列表

获取std :: vector的大小(通过扩展可变参数模板函数,使其仅与参数类型一起使用以与参数一起使用)

从结构中获取所有可变参数模板类型,该结构是函数模板中的类型参数

从 std::optional 中获取价值

可变参数模板参数中的混合类型和非类型?

可变参数模板:遍历类型/模板参数

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

在模板化类的可变参数模板中包装每种类型