Как отделить вывод типа от объявления параметра функции?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как отделить вывод типа от объявления параметра функции?

Сообщение Anonymous »

Я заметил значительное ускорение своего приложения, если моя функция foo принимает примитивные типы по значению, а не по универсальной (пересылающей) ссылке. Однако ускорение теряется, если непримитивные типы не передаются по универсальной ссылке. Если бы foo принимал фиксированное количество аргументов, это помогло бы:

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

#include 
#include 
#include 

template 
requires (!std::is_scalar_v)
auto foo(T&&){
std::puts("pass by universal reference");
}

template 
requires std::is_scalar_v
auto foo(T){
std::puts("pass by value");
}

int main(){
foo(42);  // pass by value
foo(std::string{"hello"}); // pass by universal reference

return 0;
}
Однако проблема в том, что foo принимает пакет параметров шаблона, и некоторые параметры могут быть примитивами, а другие — нет. Таким образом, foo сначала должен будет определить типы параметров, а затем, если они не являются примитивами, превратить их в универсальные ссылки. Если бы foo был шаблоном класса, этого можно было бы добиться с помощью руководств по дедукции:

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

#include 
#include 
#include 

template 
using MaybeRef = std::conditional_t;

#include 
template 
struct Foo {

Foo(MaybeRef... args) {
static_assert(std::is_same_v);
static_assert(std::is_same_v);
std::puts("passed");
}
};

template 
Foo(Ts&&...) -> Foo;

int main(){
std::string str = "hello";
Foo{42, str};

return 0;
}
Однако я не знаю, как добиться того же самого для моей функции foo.
Возможно ли это вообще и как?


Подробнее здесь: https://stackoverflow.com/questions/791 ... eclaration
Ответить

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

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

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

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

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