我正在为一些客户端-服务器函数调用编写一个包装器,我需要一种方法在实际调用之前或之后设置一些输出参数。示例代码如下:
#include <iostream>
#include <functional>
#include <string>
#include <vector>
void tryp(int a, int b, int &c, std::vector<char> ghost) { c = 7; }
void AssignRefs() {
std::cout << "P2" << std::endl;
}
template <typename T>
void IsolateRef(T &&t) {
t = 99;
}
template<typename T, typename ... A>
void AssignRefs(T &&t, A && ... a) {
IsolateRef(t);
std::cout << "P1" << std::endl;
AssignRefs(a ...);
}
template<typename ... A>
std::function<void(A ...)> wrap(void (*fn)(A ...)) {
return [](A ... a) { AssignRefs(a ...); };
}
int main() {
int z = 6;
int y = 4;
int a = 9;
int b = 77;
tryp(1,4,y,std::vector<char>{'H'});
wrap(tryp)(1,2,z,std::vector<char>{'Z'});
std::cout << "Results here: " << y << " :: " << z << " :: " << a << " :: " << b << std::endl;
}
这当然不能编译。请参阅在线尝试!链接了解更多信息。如果我删除该行
"t = 99"
就会起作用。
我真正需要的是
AssignRefs
或 IsolateRef
的模板专业化,以跳过非引用参数。
现在的问题是,如果我在函数定义中的类型之前省略
'&&'
,所有参数都将失去其引用限定符,并且对 IsolateRef
的调用不会执行任何操作。但是对于 '&&'
,每个参数都是通过引用函数 IsolateRef
来传递的。
我想要两个独立的函数,一个对非常量引用类型进行操作,另一个跳过其余参数。
上面的代码有没有简单的实现方法?
非常感谢。
一个快速的解决方案可能是检查是否可以将
t
分配为99:
#include <type_traits>
// [...]
if constexpr (std::is_assignable_v<T&&, int>) {
IsolateRef(t);
}
然后您可以将
IsolateRef
改进为不可分配类型的无操作,这样就可以在不了解其内部结构的情况下调用它。