GOOGLE ADS

пятница, 29 апреля 2022 г.

Шаблон функции С++ ограничивает тип параметра

Учитывая класс

class foo { 
public:
void func(std::string s){};
void func(int i){};
void func2(std::string s){};
void func2(int i){};
};

Я хотел бы избавиться от нескольких перегрузок функций, просто используя функции шаблона. Однако функции должны принимать ТОЛЬКО int или std::string.

Я вижу, как этого можно добиться, используя концепции С++ 20. Однако у меня нет доступа к компилятору с поддержкой концепций.

Как можно было бы достичь такой цели в С++ 17? Я хотел бы иметь возможность выполнить в спецификации шаблона, используя некоторую форму std::enable_if или аналогичную, в отличие от использования static_assert.

Ответ ниже показывает, что это можно сделать. Будет ли способ определить определение «шаблона» только один раз?

 class foo { 
template <typename arg_t,
std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>
void func(arg_t arg){}
template <typename arg_t,
std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>
void func2(arg_t arg){}
};
```


Решение проблемы

Используя enable_ifвы можете написать функцию, например

template <typename arg_t, std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> ||
std::is_same_v<std::decay_t<arg_t>, std::string>,
bool> = true>
void func(arg_t arg){}

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...