gpt4 book ai didi

c++ - 使用概念的部分特化

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:24 26 4
gpt4 key购买 nike

我刚刚阅读了 C++20 概念的示例。现在我正在尝试创建一个函数,如果给定类型是哈希表或不使用与部分特化混合的概念,该函数将打印出来。但不幸的是,它不起作用。

#include <iostream>
#include <string>

template<typename T>
concept Hashtable = requires(T a) {
{ std::hash<T>{}(a) } -> std::size_t;
};

struct Foo {};

template <typename T>
void Bar() {
std::cout << "Type T is not a hashtable" << std::endl;
}

template <Hashtable T>
void Bar<T> {
std::cout << "Type T is a hashtable" << std::endl;
}

int main()
{
Bar<Foo>();
Bar<std::string>();
}

我使用的是编译器版本 GCC HEAD 9.0.1,编译器标志是 g++ prog.cc -Wall -Wextra -I/opt/wandbox/boost-1.69.0/gcc-head/include -std=gnu++2a“-f概念”。它给了我以下编译器错误:

prog.cc:18:6: error: template-id 'Bar<T>' used as a declarator
18 | void Bar<T> {
| ^~~~~~
prog.cc:18:6: error: variable or field 'Bar' declared void
prog.cc:19:54: error: expected '}' before ';' token
19 | std::cout << "Type T is a hashtable" << std::endl;
| ^
prog.cc:18:13: note: to match this '{'
18 | void Bar<T> {
| ^
prog.cc:20:1: error: expected declaration before '}' token
20 | }
| ^

Live Demo

但我的期望是:

Type T is not a hashtable
Type T is a hashtable

我的问题

是否可以专门使用概念?

最佳答案

函数模板不能部分特化(而且永远不可能)。概念不会改变这条规则。

但是,函数模板可以被重载(并且总是可以)。概念确实使这更容易:

template <typename T>
void Bar() {
std::cout << "Type T is not a hashtable" << std::endl;
}

template <Hashtable T>
void Bar() {
std::cout << "Type T is a hashtable" << std::endl;
}

int main()
{
Bar<Foo>(); // calls the first Bar
Bar<std::string>(); // calls the second Bar
}

我们说第二个 Bar 比第一个 Bar 更受约束

关于c++ - 使用概念的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55234054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com