Tôi đang cố gắng tạo hàm bao hàm chung có chức năng làm đối số mẫu và lấy các đối số giống như hàm đó làm đối số của nó. Ví dụ:Trình bao bọc hàm chức năng C++ với chức năng làm đối số mẫu
template <typename F, F func>
/* return type of F */ wrapper(Ts... Args /* not sure how to get Ts*/)
{
// do stuff
auto ret = F(std::forward<Ts>(args)...);
// do some other stuff
return ret;
}
Các giải pháp cần phải được cast cho một con trỏ hàm với cùng loại như func
để tôi có thể vượt qua nó để một api C. Nói cách khác, giải pháp cần phải là một hàm và không phải là một đối tượng hàm. Quan trọng nhất, Tôi cần để có thể làm việc trong hàm wrapper.
Nếu các ý kiến inline không rõ ràng, tôi muốn để có thể làm điều gì đó như sau:
struct c_api_interface {
int (*func_a)(int, int);
int (*func_b)(char, char, char);
};
int foo(int a, int b)
{
return a + b;
}
int bar(char a, char b, char c)
{
return a + b * c;
}
c_api_interface my_interface;
my_interface.func_a = wrapper<foo>;
my_interface.func_b = wrapper<bar>;
Tôi nhìn cho bài viết có liên quan và phát hiện này, nhưng không ai trong số họ là khá gì Tôi đang cố gắng làm. Hầu hết các bài viết này đều liên quan đến các đối tượng hàm. Là những gì tôi đang cố gắng làm thậm chí có thể?
Function passed as template argument
Function wrapper via (function object) class (variadic) template
How does wrapping a function pointer and function object work in generic code?
How do I get the argument types of a function pointer in a variadic template class?
Generic functor for functions with any argument list
Để trả lời 2 câu trả lời đầu tiên, tôi đã chỉnh sửa câu hỏi để làm rõ rằng tôi cần có khả năng làm việc trong hàm bao bọc (tức là sửa đổi một số trạng thái toàn cầu trước và sau khi gọi hàm bọc)
Cảm ơn bạn! Tôi thay đổi điều này thành câu trả lời được chấp nhận vì nó ngắn hơn của @TC, chỉ sử dụng một hàm chứ không phải cấu trúc, sử dụng 'std :: forward' và (như là một ý kiến) dễ hiểu hơn vì bạn không sử dụng chuyên môn đối số mẫu. – Eric
Mặc dù tôi phải thừa nhận std :: forward chỉ có trong đó bởi vì tôi đã thử một cái gì đó mà sẽ biên dịch theo MSVC và sau đó nghĩ "ah vít nó, sẽ không xảy ra ... nhưng hey, giữ phía trước" ;-) – VolkerK
Điều gì là cách thích hợp để khai báo một bí danh cho trình bao bọc sẽ trông giống như một hàm bình thường để gọi? Một cái gì đó như 'sử dụng a_wrapped = wrapper;' (nhưng cái này không hoạt động). –
eudoxos