c++ - Variadic 模板函数参数和引用类型推导

标签 c++ templates variadic type-deduction

我在这里遗漏了一些关于类型推导的非常基本的东西:

我正在尝试编写一个包装函数,它调用一个带有 nullptr 的编写器函数以获得所需的长度,然后调整缓冲区大小,然后再次调用该函数,现在使用调整大小的缓冲区,以获得最终输出。有很多这样的编写器函数,我想将调用/调整大小/调用模式概括为可变参数模板函数。

但是,当列表中的任何参数是 const 引用时,我一直试图将函数指针传递给采用可变参数的函数,并传递可变参数:

static void val_arg(int)            { }
static void ref_arg(const int&)     { }

template <typename... Args>
static void helper(void (*fun)(Args...), Args... args)
{
    (*fun)(args...);
}

void proxy(const int& arg)
{
    helper(&val_arg, arg);  // Fine
    helper(&ref_arg, arg);  // 'void helper(void (__cdecl *)(Args...),Args...)': template parameter 'Args' is ambiguous
                            // note: could be 'const int&'
                            // note: or       'int'
}

void test()
{
    proxy(1);               // Force 1 to be const int&
}

我该怎么做才能让它透明地接受这两种情况?为什么它不承认传入的函数接受一个 const ref,而代理的参数也是一个 const ref?

最佳答案

Args... 不会推导出引用类型。

template <typename Fun, typename... Args>
static void helper(Fun fun, Args&&... args)
{
    fun(std::forward<Args>(args)...);
}

关于c++ - Variadic 模板函数参数和引用类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243012/

相关文章:

c++ - 使用 "pop_front"从排序列表中删除元素会导致崩溃

javascript - 加载模板和创建范围时应该使用 "controllers"还是 "directives"?

scala - 可变参数函数被编译成什么?

C++ 模板包推导——我在这个例子中做错了什么?

objective-c - 如何覆盖 Objective-C 中的可变参数方法

c++ - 无法在 VS 2017 应用程序中使用 MFC CObject 类

c++ - 指针转换错误c++

c++ - C++ 工具链和编译器之间有什么区别?

C++ - 为任何 lambda 创建实例化桶

c++ - 模板函数作为模板仿函数的模板参数