Резюме: я хочу закончить с функцией, которая выводит точные типы, с которыми она была вызвана, и принимает (например) кортеж, который передает их (типы которых будут отличаться от точных типовфункция была вызвана с помощью.)
Я застрял, пытаясь «узнать» через дедукцию типы аргументов для данной функции, одновременно передавая их.Я думаю, что я мог бы упустить что-то решающее в том, как это работает.
#include <tuple>
#include <string>
#include <functional>
template <typename ...Args>
struct unresolved_linker_to_print_the_type {
unresolved_linker_to_print_the_type();
};
void f(int,double,void*,std::string&,const char*) {
}
template <typename F, typename ...Args>
void g1(F func, Args&&... args) {
unresolved_linker_to_print_the_type<Args...>();
auto tuple = std::forward_as_tuple(args...);
unresolved_linker_to_print_the_type<decltype(tuple)>();
}
template <typename F, typename T, typename ...Args>
void g2(F func, const T& tuple, Args... args) {
unresolved_linker_to_print_the_type<Args...>();
unresolved_linker_to_print_the_type<decltype(tuple)>();
}
int main() {
int i;
double d;
void *ptr;
std::string str;
std::string& sref = str;
const char *cstr = "HI";
g1(f, i,d,ptr,sref,cstr);
g2(f, std::forward_as_tuple(i,d,ptr,sref,cstr), i,d,ptr,sref,cstr);
}
Что я хотел бы увидеть, так это сценарий, когда моя функция (например, g1
или g2
) получает вызови может использовать оба исходных типа - int,double,void*,std::string&,const char*
и также переадресованные аругменты.
В этом случае мне кажется, что я не могу найти эту информацию из g1
илиg2
.Ошибка компоновщика (преднамеренное, чтобы распечатать типы) показывает мне в g1
они:
int&, double&, void*&, std::string&, char const*&
int&, double&, void*&, std::string&, char const*&
и в g2
:
int, double, void*, std::string, char const*
int&, double&, void*&, std::string&, char const*&
Есть две вещи, которые яне получить здесь:
Почему ни один из напечатанных (через ошибку компоновщика) типов не соответствует тому, что я фактически передал?(int,double,void*,std::string&,const char
).Могу ли я сделать вывод, что я на самом деле был передан?Желательно с «естественным» синтаксисом, т.е. все только один раз и ничего явно не выписано.Я могу явно написать:
g2<decltype(&f),decltype(std::forward_as_tuple(i,d,ptr,sref,cstr)),int,double,void*,std::string&,const char*>(f,std::forward_as_tuple(i,d,ptr,sref,cstr),i,d,ptr,sref,cstr);
, но это, по меньшей мере, "громоздко"!
В g1
наличие &&
в сигнатуре функцииКажется, объявление меняет типы в параметре шаблона Args
.Сравните это с:
template <typename T>
void test(T t);
Или:
template <typename T>
void test(T& t);
, используя любой из них с:
int i;
test(i);
не меняет тип T
.Почему &&
меняет тип T
, а &
нет?