Я пытаюсь написать шаблон функции, сделать , который строит различные объекты на основе указанного параметра шаблона. Вызов этой функции может выглядеть что -то вроде 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
В чем разница между использованием `enable_if` в спецификации шаблона и в типе возвращаемого значения? ⇐ C++
Программы на C++. Форум разработчиков
1737681039
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, означает, что я больше не использую значения по умолчанию для параметров шаблона, что делает этот вопрос избыточным.
Подробнее здесь: [url]https://stackoverflow.com/questions/79372130/what-is-the-difference-between-using-enable-if-in-the-template-specification-v[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия