Tóm tắt: Tôi muốn kết thúc với một hàm suy ra các loại chính xác nó được gọi và lấy (ví dụ) một bộ chuyển tiếp chúng (các loại sẽ được khác với các loại chính xác mà hàm được gọi với).Hiểu biết về các loại gốc, trong khi đồng thời chuyển tiếp
Tôi đang cố gắng cố gắng "biết" qua việc khấu trừ các loại đối số cho một hàm nhất định, trong khi đồng thời chuyển tiếp chúng. Tôi nghĩ rằng tôi có thể thiếu một cái gì đó rất quan trọng về cách thức hoạt động của nó.
#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);
}
Những gì tôi muốn thấy là một kịch bản mà khi chức năng của tôi (ví dụ g1
hoặc g2
) được gọi nó biết và có thể sử dụng cả hai loại gốc - int,double,void*,std::string&,const char*
và các arugments chuyển quá.
Trong trường hợp này, tôi dường như không thể tìm thấy thông tin này từ bên trong g1
hoặc g2
. Các (cố ý, để in ra các loại) mối liên kết lỗi cho tôi trong g1
đó là:
int&, double&, void*&, std::string&, char const*&
int&, double&, void*&, std::string&, char const*&
và trong g2
:
int, double, void*, std::string, char const*
int&, double&, void*&, std::string&, char const*&
Có hai điều tôi không nhận được ở đây:
Tại sao không có loại in nào (thông qua lỗi trình liên kết) khớp với những gì tôi thực sự chuyển vào? (
int,double,void*,std::string&,const char
). Tôi có thể suy ra những gì tôi thực sự đã được thông qua? Tốt hơn là với cú pháp "tự nhiên", tức là mọi thứ chỉ một lần và không có gì được viết rõ ràng. Tôi rõ ràng có thể viết: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);
nhưng đó là "khó sử dụng" để nói rằng ít nhất!
Trong
g1
sự hiện diện của&&
trong khai báo chữ ký hàm dường như thay đổi các loại trong thông số mẫuArgs
. Hãy so sánh điều đó với:template <typename T> void test(T t);
Hoặc:
template <typename T> void test(T& t);
sử dụng một trong những người có:
int i; test(i);
không làm thay đổi loại
T
. Tại sao số&&
thay đổi loạiT
khi&
không?
Re: "tl; dr" - 2p2er? –
Trình biên dịch nào bạn đang sử dụng có hỗ trợ các tham số mẫu của vectơ? –
@JohnDibling g ++ 4.7.0, 20111010 sửa đổi thân cây 179769 biên dịch nhưng không liên kết (tức là những gì tôi mong đợi để tôi có thể thấy các loại lỗi liên kết) – Flexo