C++ 如何在可变模板上表达概念?

C++ 如何在可变模板上表达概念?,c++,tuples,variadic-templates,c++20,c++-concepts,C++,Tuples,Variadic Templates,C++20,C++ Concepts,我想定义一个只有具有特定类型值的元组才能满足的概念 为了简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做 e、 g std::tuple//满足概念 std::tuple//不满足概念 问题是我必须制定类似于“每种类型”。也不允许使用递归概念。非常简单: namespace impl { template <class T> struct is_tuple_of_integrals : std::false_type { }; te

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

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

e、 g

std::tuple//满足概念
std::tuple//不满足概念
问题是我必须制定类似于“每种类型”。也不允许使用递归概念。

非常简单:

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;
namespace impl{
模板
结构是积分的元组
:std::false_type{};
模板
结构是积分的元组
:std::true_type{};
}
模板
_积分的概念元组=impl::是_积分的元组::值;
我确实想知道中间特征是否可以省略,但如果没有概念专门化,我不这么认为。

我的解决方案:

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

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

}
模板
概念数字元组=(标准::是积分的&&;
模板
void foo(std::tuple t)需要数字元组{
}

我用折叠表达这个概念。

我听说你喜欢概念。所以我在你的概念中加入了一个概念,这样你可以在检查约束的同时检查约束:)@StoryTeller UnslanderMonica这是一个概念!我的意思是,sfinae当然是一种选择(因此我投了赞成票),但我仍然对只使用概念的解决方案感兴趣。或者,如果这不可能成为原因,因为目前关于概念的问题很少,这使得初学者很难学习。@user3520616这里没有SFINAE,只有部分专业化。如前所述,我相信我们在某些时候需要一个元素来访问元组元素,而概念不能部分专用,因此我们需要介于两者之间的其他东西。@user3520616好吧,第一个概念只能通过类型列表直接调用。第二个代码段定义了一个函数模板,而不是一个概念——尽管您确实可以在
decltype
中使用重载函数模板来执行模式匹配,而不是类模板。或者更简洁的变体:
template void foo(std::tuple){}
@Quentin是的,您的解决方案甚至更好。
template<typename ... Args>
concept numeric_tuples = (std::is_integral_v<Args> && ...);

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

}