У меня есть шаблонная функция template<typename T> foo (const T&);
, и я хочу ограничить T
только двумя типами данных myVec1
и myVec2
, которые определяются как
using myVec1 = std::vector<int>;
using myVec2 = std::vector<float>;
Конечно, мой пример из реального мира намного сложнее, чем этот.
Я знаю, что, например, лучше всего использовать концепции.
template typename<T>
requires std::floating_point<T>
Но как мне изменить приведенный выше код, чтобы разрешить использование двух типов данных vector
(myVec1
, myVec2
) вместо типов с плавающей запятой?
Первые два связанных дубликата действительны для компиляторов старше C++20, тогда как OP специально запрашивает C++20 или новее.
@JeJo Вот почему я добавил дубликат этого ответа, который решает проблемы ОП. И легко заменить Enable на Concept, как только вы поймете, что происходит (но не обязательно наоборот).
@JeJo Если да, то вы можете/должны добавить свой ответ в дубликат.
Возможно, поскольку у вас есть только 2 типа, предоставьте 2 (не шаблонные) перегрузки и спрячьте шаблон в исходном файле (тогда ограничения станут менее необходимыми).
Как изменить приведенный выше код, чтобы разрешить использование двух векторных типов данных вместо float?
Вы не изменяете std::floating_point
, потому что он содержит другие типы float помимо float
.
Поэтому просто напишите свою концепцию сценария:
using myVec1 = std::vector<int>;
using myVec2 = std::vector<float>;
template<typename T>
concept MyVectorType = std::same_as<T, myVec1> || std::same_as<T, myVec2>;
template<MyVectorType T> void foo(const T& vec)
{
// ... implementation
}
Или просто используйте requires
, чтобы ограничить тип T
до int
или float
.
template<typename T>
requires std::same_as<T, int> || std::same_as<T, float>
void foo(const std::vector<T>& vec)
{
// .... implementation
}
Обратите внимание, что
double
также является типом с плавающей запятой.