В чем разница между использованием `enable_if` в спецификации шаблона и в типе возвращаемого значения?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В чем разница между использованием `enable_if` в спецификации шаблона и в типе возвращаемого значения?

Сообщение Anonymous »

Я пытаюсь написать шаблон функции make, который создает различные объекты на основе указанного параметра шаблона. Вызов этой функции может выглядеть примерно так: make(1, 8);. Для этого я использую SFINAE, но мне не ясно, лучше ли использовать Enable_if_t для указания типа возвращаемого значения или использовать его в спецификации шаблона.
Насколько я понимаю, есть два возможных варианта, как описано ниже:

Код: Выделить всё

#include 
#include 
#include 

/////////////////////////////////////////////////
// Option 1: Specify the return type
/////////////////////////////////////////////////

// make_1 for sets
template
std::enable_if_t make_1(int first, int second){
return return_type({first, second});
}

// make_1 for vectors
template
std::enable_if_t make_1(int first, int second){
return return_type({second, first});
}

// make_1 for other different types
// ...

/////////////////////////////////////////////////
// Option 2: Use a template parameter
/////////////////////////////////////////////////

// make_2 for sets
template
return_type make_2(int first, int second){
return return_type({first, second});
}

// make_2 for vectors
template
return_type make_2(int first, int second){
return return_type({second, first});
}

// make_2 for other different types
// ...

int main() {
auto s1 = make_1(4, 5);
auto v1 = make_1(6, 7);

auto s2 = make_2(7, 8);
auto v2 = make_2(9, 10);
}
Для каждого из этих вариантов могут существовать десятки различных реализаций для создания объектов разных типов, а не только двух (множеств и векторов), указанных выше.
Мои вопросы
Является ли один из этих вариантов лучше или надежнее другого? Мне кажется, что после успешной замены они оба дадут одно и то же, но, возможно, они обрабатывают ошибку замены по-разному?
Примечания
Я использую C++17, и это нельзя изменить, но ответы, относящиеся к другим стандартам, по-прежнему приветствуются! Кроме того, типы, используемые в моем проекте, являются пользовательскими типами, а не стандартными контейнерами, поэтому этот вопрос на самом деле не касается различных способов создания контейнеров.
ИзменитьИзначально я также сказал:

Я знаю, что мне нужно быть осторожным с шаблонами функций, которые отличаются только значениями параметров шаблона по умолчанию. ; имеет ли это значение, поскольку значение по умолчанию в варианте 2 зависит от параметра шаблона, у которого нет значения по умолчанию?

Ответ на этот вопрос — да, как уже отмечалось автор @NatanOliver в комментариях. Изменение, которое я внес в свой mwe, означает, что я больше не использую значения по умолчанию для параметров шаблона, что делает этот вопрос излишним.

Подробнее здесь: https://stackoverflow.com/questions/793 ... fication-v
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»