Как ограничить функцию шаблона определенными типами?

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

Обратите внимание, что double также является типом с плавающей запятой.

Bob__ 16.08.2024 09:11
Шаблон функции C++ ограничивает тип параметра и Ограничивает параметр шаблона шаблона одним из двух типов . Также см. этот ответ, в котором используется концепция C++20, которая решит вашу проблему.
user12002570 16.08.2024 09:20

Первые два связанных дубликата действительны для компиляторов старше C++20, тогда как OP специально запрашивает C++20 или новее.

JeJo 16.08.2024 09:31

@JeJo Вот почему я добавил дубликат этого ответа, который решает проблемы ОП. И легко заменить Enable на Concept, как только вы поймете, что происходит (но не обязательно наоборот).

user12002570 16.08.2024 11:42

@JeJo Если да, то вы можете/должны добавить свой ответ в дубликат.

user12002570 16.08.2024 11:48

Возможно, поскольку у вас есть только 2 типа, предоставьте 2 (не шаблонные) перегрузки и спрячьте шаблон в исходном файле (тогда ограничения станут менее необходимыми).

Jarod42 16.08.2024 15:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как изменить приведенный выше код, чтобы разрешить использование двух векторных типов данных вместо 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
}

Другие вопросы по теме

Похожие вопросы

Visual Studio C++: копирование проектов и решений с одного компьютера на другой (github не работает)
Странное поведение кнопки EnableWindow при нажатии
Можно ли с уверенностью предположить, что 32-битные числа с плавающей запятой можно напрямую сравнивать друг с другом, если значение соответствует мантиссе?
Практическое руководство: функция C++, которая настраивает тип возвращаемого значения в соответствии с потребностями вызывающей стороны
Возвращает ли low_bound() один и тот же результат с обратными итераторами вектора в порядке возрастания и прямыми итераторами вектора в порядке убывания?
Почему std::make_format_args ожидает неконстантную ссылку
C++ Существует ли быстрый многомерный массив, который позволяет использовать подмассивы разного размера?
Необходим ли std::atomic или voluty при установке переменных из обработчика сигналов?
Могу ли я вызвать CreateString встроенным при создании таблицы?
Строка повреждена после перекодирования