Я пытаюсь написать шаблон функции, сделать , который строит различные объекты на основе указанного параметра шаблона. Вызов этой функции может выглядеть что -то вроде 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