c++ - 制作代码 "forwarding referencable"

标签 c++ c++11 forwarding-reference

我打开了this关于转发引用的帖子,这是一个(希望如此)MCVE 代码:

#include <functional>
#include <vector>

using namespace std;
struct MultiMemoizator {
    template <typename ReturnType, typename... Args>
    ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, Args&&... args) {

    }
};

typedef vector<double> vecD;

vecD sort_vec (const vecD& vec) {
    return vec;
}

int main()
{
    vecD vec;
    std::function<vecD(const vecD&)> sortFunc(sort_vec);
    MultiMemoizator mem;
    mem.callFunction<vecD, vecD>(sortFunc, vec);
}

由于这不是全部代码,也许我必须根据答案添加额外的代码。

无论如何,正如this中所建议的那样回答,此版本无法转发引用,因为未推导Args

所以我的问题是:是否可以使此代码“转发可引用”?

最佳答案

为了完美转发您的论点,您需要推导类型。您可以通过分别推导函数的参数和仿函数的参数来做到这一点:

template <typename ReturnType, typename... FunArgs, typename... Args>
ReturnType callFunction(std::function<ReturnType(FunArgs...)> memFunc,
                        Args&&... args) 
{
    //...
}

然后你可以在没有模板参数的情况下调用 callFunction 并推导出所有内容:

mem.callFunction(sortFunc, vec);

关于c++ - 制作代码 "forwarding referencable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843699/

相关文章:

c++ - 在所有 std::futures 完成之前从函数返回是否安全?

c++ - 结构化绑定(bind)和转发引用混合得好吗?

c++ - QT中如何制作带触发器的图片按钮

c++ - 在 C++ 中编写复制构造函数和赋值运算符的 list

c++ - constexpr 和弃用的转换警告

c++ - 无法从通用引用中捕获 lambda 中的引用?

c++ - 我什么时候应该 std::forward 一个函数调用?

c++ - 模板元编程列表

c++ - 从 gdb 设置 std::string 变量值?

c++ - 性能与 C++ 内存模型