Как выбрать свободную функцию с помощью std :: conditional - PullRequest
1 голос
/ 06 мая 2019

У меня довольно много пар свободных функций приведенной ниже формы из некоторой библиотеки C:

void dvecse(int, double, double *, int);
void svecse(int, float,  float *,  int);

Я хочу обернуть их в C ++ так, чтобы я мог вызвать одну функцию, например, vecseи позвольте компилятору выяснить, какой из двух вызывать.

Я пытался добиться этого с помощью std::enable_if, но я не думаю, что он предназначен для этого (семантика включения / выключения вместо выбора) ичто-то вроде ниже, очевидно, не компилируется из-за переопределения:

template <typename T>
std::enable_if<std::is_same<T, double>::value> vecse = dvecse;

template <typename T>
std::enable_if<std::is_same<T, float>::value> vecse = svecse;

Кроме того, я попытался std::conditional, который, кажется, работает только с типами, а не со свободными функциями (альтернативой может быть конструкция с функторами,но я бы обернул все свободные функции в функциональные объекты).

Каким будет краткий способ выбора функции во время компиляции?

1 Ответ

5 голосов
/ 06 мая 2019

Вам не нужны шаблоны, когда перегрузка сделает:

void vecse(int a, double b, double* c, int d) { dvesce(a,b,c,d); }
void vecse(int a, float b, float* c, int d) { svecse(a,b,c,d); }

PS: Я бы посоветовал вам использовать значимые имена. Мне пришлось трижды проверить на опечатки.

PPS: когда вам нужно сделать что-то свое для каждого типа (здесь: вызов соответствующего метода), вы обычно не получаете много пользы от шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...