Он работал для меня в окнах таким образом:
python3 -m pip install package
Шаблоны функций не могут быть частично специализированными (и никогда не могут быть). Концепции не меняют это правило.
Однако шаблоны функций могут быть перегружены (и всегда могут быть). И концепции делают делают это проще:
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
.
Можно ли специализироваться, используя понятия?
blockquote>Нет, невозможно частично специализировать понятия. Согласно онлайн-ссылке на Ограничения и понятия :
Явные экземпляры, явные специализации, или частичные специализации понятий не допускаются (значение оригинальное определение ограничения не может быть изменено).
blockquote>А что касается шаблонов функций, они могут быть только перегружены, а не частично специализированы.
Я заменил специализацию шаблона функции специализацией структур, и мой код работает нормально Посмотрите на следующий код.
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <string>
template<typename T>
concept Hashtable = requires(T a) {
{ std::hash<T>{}(a) } -> std::size_t;
};
struct Foo {};
template <typename T>
struct Boo {
static constexpr char value[] = "Type T is not a hashtable";
};
template <Hashtable HashT>
struct Boo<HashT> {
static constexpr char value[] = "Type T is a hashtable";
};
template <typename T>
void Bar() {
std::cout << Boo<T>::value << std::endl;
}
int main()
{
Bar<int>();
Bar<Foo>();
}