Учитывая класс
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){}
Комментариев нет:
Отправить комментарий