如何通过可变参数模板表达概念?

use*_*616 4 c++ tuples variadic-templates c++-concepts c++20

我想定义一个概念,只有具有特定类型值的元组才能满足。

让我们说简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做?

例如

std::tuple<int16_t, int32_t> // satisfies concept
std::tuple<std::string, double> // doesn't satisfy concept
Run Code Online (Sandbox Code Playgroud)

问题是我必须制定类似“for_each_type”的内容。也不允许递归概念。

Que*_*tin 8

很简单:

namespace impl {
    template <class T>
    struct is_tuple_of_integrals
    : std::false_type { };
    
    template <std::integral... Ts>
    struct is_tuple_of_integrals<std::tuple<Ts...>>
    : std::true_type { };
}

template <class T>
concept tuple_of_integrals = impl::is_tuple_of_integrals<T>::value;
Run Code Online (Sandbox Code Playgroud)

我确实想知道是否可以省略中间特征,但我不相信没有概念专业化。

  • 我听说你喜欢概念。所以我在你的概念中加入了一个概念,这样你就可以在检查约束的同时检查约束:) (4认同)
  • @StoryTeller-UnslanderMonica 这是从头到尾的概念! (2认同)

小智 8

我的解决方案:

template<typename ... Args>
concept numeric_tuples = (std::is_integral_v<Args> && ...);

template<typename ... Args>
void foo(std::tuple<Args...> t) requires numeric_tuples<Args...> {

}
Run Code Online (Sandbox Code Playgroud)

我对这个概念使用了折叠表达式。

  • 或者更简洁的变体:`template &lt;std::integral... Ts&gt; void foo(std::tuple&lt;Ts...&gt;) { }` (4认同)