Я только что читал примеры C ++ 20 Concepts.Теперь я пытаюсь создать функцию, которая будет распечатывать, если данный тип является хеш-таблицей или не использует понятия, смешанные с частичной специализацией.Но, к сожалению, это не работает.
#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 "-fconcepts"
.Это дает мне следующую ошибку компилятора:
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
Мой вопрос
Можно ли специализироваться с помощью концепций?