У меня есть шаблонная функция 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также является типом с плавающей запятой.