相关疑难解决方法(0)

'auto' 作为函数参数的模板参数占位符

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 的合法语法吗?


相关:C++ 概念的通配符说“接受这个模板参数的任何东西”

c++ templates auto c++20

25
推荐指数
1
解决办法
1424
查看次数

模板接受C++中的"任何东西"

我有一个简单的模板结构,将字符串与值相关联

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*>>,但这似乎是一个糟糕的解决方案......有更好的方法吗?

c++ templates wildcard variadic c++11

7
推荐指数
2
解决办法
4759
查看次数

为什么is_base_of在只是普通的char类型时失败

你明白为什么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",仍然失败了.

c++

5
推荐指数
2
解决办法
133
查看次数

使用函数重载解析的概念(而不是 SFINAE)

试图向 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)

相关问题:Concepts 会取代 SFINAE 吗?

c++ sfinae overload-resolution c++-concepts c++20

4
推荐指数
1
解决办法
267
查看次数