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

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

Сообщение Anonymous »

Я пытаюсь написать шаблон функции, сделать , который строит различные объекты на основе указанного параметра шаблона. Вызов этой функции может выглядеть что -то вроде Make (1, 8); . Для этого я использую Sfinae, но мне не ясно, лучше ли использовать Enable_if_t , чтобы указать тип возврата или использовать его в спецификации шаблона.
Как я вижу, есть два возможных варианта, как указано ниже: < /p>
#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);
}
< /code>
Для каждой из этих вариантов могут быть десятки различных реализаций, чтобы сделать объекты разных типов, а не только два (наборы и векторы), указанные выше. < /p>
мои вопросы < /h2>
является одним из этих вариантов лучше или более эффективным, чем другой? < /p>
Есть и другие вопросы (например, этот ), которые обсуждают, почему вы можете предпочесть использовать параметр шаблона по стилистическим причинам и объяснить, почему один метод может быть проще реализовать, чем другой, но он не учитывает никаких различий в том, как функции обрабатываются во время компиляции. Мне кажется, что они оба решат одно и то же после замены. Это на самом деле так? Если нет, то каким образом компилятор обрабатывает их по -разному? Изменены, но ответы, связанные с другими стандартами, все еще очень приветствуются! Кроме того, типы, используемые в моем фактическом проекте, являются пользовательскими типами, а не стандартными контейнерами, поэтому этот вопрос на самом деле не задает различные способы построения контейнеров.
edit < Br /> Я первоначально также сказал: < /p>

Я знаю ; Этот матер здесь, так как значение по умолчанию в опции 2 зависит от параметра шаблона без значения по умолчанию? @natanoliver в комментариях. Редактирование, которое я сделал для моего MWE, означает, что я больше не использую значения по умолчанию для параметров шаблона, что делает этот вопрос избыточным.

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

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

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

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

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

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