专门化可变参数模板以跳过非引用参数

问题描述 投票:0回答:1

我正在为一些客户端-服务器函数调用编写一个包装器,我需要一种方法在实际调用之前或之后设置一些输出参数。示例代码如下:

#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
来传递的。

我想要两个独立的函数,一个对非常量引用类型进行操作,另一个跳过其余参数。

上面的代码有没有简单的实现方法?

非常感谢。

c++ pass-by-reference variadic-templates
1个回答
0
投票

一个快速的解决方案可能是检查是否可以将

t
分配为99:

#include <type_traits>
// [...]

if constexpr (std::is_assignable_v<T&&, int>) {
    IsolateRef(t);
}

然后您可以将

IsolateRef
改进为不可分配类型的无操作,这样就可以在不了解其内部结构的情况下调用它。

© www.soinside.com 2019 - 2024. All rights reserved.