C++20 允许使用auto函数参数类型。
它是否还允许auto用作函数参数类型的模板参数占位符(不相似,但在某种程度上符合C++17 template<auto>的精神)?
所以下面的代码,在 C++20 之前:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Run Code Online (Sandbox Code Playgroud)
可以写成:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Run Code Online (Sandbox Code Playgroud)
它确实可以编译并与概念的实验性 GCC 实现一起很好地工作。
它是 C++20 的合法语法吗?
我有一个简单的模板结构,将字符串与值相关联
template<typename T> struct Field
{
std::string name; T self;
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数,我想接受任何类型的1个或多个字段,而字段可能是不同类型的,所以我使用的是std::initializer_list因为C++,据我所知,缺少类型的可变参数,无法确定可变参数的大小,并且必须至少有一个其他参数来确定从哪里开始.
问题是我不知道如何告诉它接受可能属于不同类型的字段.在Java中,我只会使用foo(Field<?> bar, Field<?>... baz),但C++缺少类型化的可变参数和通配符.我唯一的另一个想法是制作类型的参数
std::initializer_list<Field<void*>>,但这似乎是一个糟糕的解决方案......有更好的方法吗?
你明白为什么static_assert失败了:
template <typename T>
void
foo(const T &c)
{
static_assert(std::is_base_of<T, char>::value, "T must be char"); // Fails !
}
int main()
{
char c = 'a';
foo<char>(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我交换了T和"char",仍然失败了.
试图向 SFINAE 说再见。
是否可以使用concepts来区分函数,以便编译器可以根据发送的参数是否满足concept约束来匹配正确的函数?
例如,重载这两个:
// (a)
void doSomething(auto t) { /* */ }
// (b)
void doSomething(ConceptA auto t) { /* */ }
Run Code Online (Sandbox Code Playgroud)
因此,当被调用时,编译器会在每次调用时匹配正确的函数:
doSomething(param_doesnt_adhere_to_ConceptA); // calls (a)
doSomething(param_adheres_to_ConceptA); // calls (b)
Run Code Online (Sandbox Code Playgroud)