是否有一种方法允许带有模板参数的概念
与提供的任何模板参数一致?
template<class Me, class TestAgainst>
concept derived_from_or_same_as =
std::same_as<Me, TestAgainst> ||
std::derived_from<Me, TestAgainst>;
template<class P, class First, class Second>
concept Pair = requires(P p) {
requires derived_from_or_same_as<decltype(p.first), First>;
requires derived_from_or_same_as<decltype(p.second), Second>;
};
// this works well
void doWithPairOfA(const Pair<A, A> auto& p) { /* */ }
用例[b]-接受任何有效的对,对内部类型没有限制:
// this is *pseudo code* as Pair<auto, auto> is not allowed
void doWithAnyPair(const Pair<auto, auto> auto& p) { /* */ }
不幸的是,auto在C++20中不允许作为模板参数占位符。
所以对
目前还不是解决方案。
// Any as wildcard
foo(lst: List[Any]) -> List[str]
// '?' as wildcard
List<String> foo(List<?> lst)
// not as good as with concepts above, this allows only "pair" of A and A
// **but rejects sub-types of A, which is not good**
// and there is no check that this is actually a pair (can be added with SFINAE)
template<template<class, class> typename PAIR>
void doWithPairOfA(const PAIR<A, A>& p) { /* */ }
// not as good as we would wish - we do allow any kind of "pair"
// but there is no check that this is actually a pair (can be added with SFINAE)
template<template<class, class> typename PAIR, typename ANY1, typename ANY2>
void doWithAnyPair(const PAIR<ANY1, ANY2>& p) { /* */ }
概念能提供更好的解决方案吗?
1关于模板的相关问题(前C++20):模板接受C++中的“任何东西”
您可以通过修改对概念
来接受和检查标记类型any来实现通配符行为。
让我们首先将Any声明为标记类,不需要实现它。
class Any;
现在我们可以创建一个type_matches概念
来检查类型T是否与给定的类型a匹配,其规则如下:
template<class Me, class TestAgainst>
concept type_matches =
std::same_as<TestAgainst, Any> ||
std::same_as<Me, TestAgainst> ||
std::derived_from<Me, TestAgainst>;
template<class P, class First, class Second>
concept Pair = requires(P p) {
requires type_matches<decltype(p.first), First>;
requires type_matches<decltype(p.second), Second>;
};
// can be called with a Pair of As or sub-type of As
void doWithPairOfA(const Pair<A, A> auto& p) { /* */ }
用例[b]-接受任何有效的对,对内部类型没有限制:
void doWithAnyPair(const Pair<Any, Any> auto& p) { /* */ }
代码:https://godbolt.org/z/higx9f
我有一个简单的模板结构将字符串与值关联起来 我有一个函数,我希望接受1个或多个任何类型的字段,这些字段可能是不同的类型,所以我使用,因为据我所知,C++缺少类型化变量参数,不能确定变量参数的大小,并且必须至少有一个其他参数来确定从哪里开始。 问题是我不知道如何告诉它接受可能是不同类型的字段。在Java中,我只使用,但是C++缺少类型化变量参数和通配符。我唯一的另一个想法是使参数类型为,但这似乎是一
对于概念,提供了很好的语法,如
(...)“m”不约束类型(...)
问题内容: 我正在尝试将用c ++编写的并行排序包装为模板,以将其与任何数字类型的numpy数组一起使用。我正在尝试使用Cython来做到这一点。 我的问题是我不知道如何将指向正确类型的numpy数组数据的指针传递给C ++模板。我相信我应该为此使用融合dtypes,但是我不太了解如何使用。 .pyx文件中的代码如下 过去,我对所有可能的dtype进行了丑陋的for循环处理,但我相信应该有更好的方