如何使用可变参数模板编写通用函数包装器

丘里尔

我刚刚开始沉迷于模板的高级使用。我正在尝试为函数编写通用包装器,以包装可能导致异常的功能。如果没有异常发生,则包装函数应将实际的返回值写入某个引用,然后返回true如果发生异常,则仅返回false

#include <string>
#include <iostream>
#include <functional>
#include <exception>
#include <iomanip>

template<typename TReturn, typename ... TArgs>
bool Try(std::function<TReturn(TArgs...)> &function, typename std::function<TReturn(TArgs...)>::result_type& res, TArgs&...args) {
    try {
        res = function(std::forward<TArgs>(args)...);

        return true;
    }
    catch (...) {
        return false;
    }
}

std::string foo(int val) {
    if (val == 0) {
        throw std::exception();
    }

    return "result";
}

int main() {
    std::string res = "noResult";

    //Should be "false=>noResult"
    std::cout << std::boolalpha << Try(foo, res, 0) << "=>" << res;

    //Should be "true=>result"
    std::cout << std::boolalpha << Try(foo, res, 1) << "=>" << res;
}

期望

我期望像这样的模板实例化 bool Try(std::function<std::string(int)>& function, std::string& res, int&arg);

相反,它甚至不编译:

错误:

没有函数模板“ Try”的实例与参数列表匹配

'bool Try(std :: function <_Ret(_Types ...)>,std :: function <_Ret(_Types ...)> :: result_type&,TArgs&...)':无法推断出模板参数来自'std :: string(int)'的'std :: function <_Ret(_Types ...)>'

我想我的通话方式Try也可能有缺陷。


我发现了 这个类似的问题, 但无法使其与返回类型一起使用。

是的,对于return函数,需要有一个特殊的重载void


我缺少什么,怎么办?提前致谢!

卡米尔库克

为什么那么多std::function

template<typename TReturn, typename ... TArgs>
bool Try(TReturn (&function)(TArgs...), TReturn& res, TArgs...args) {
    try {
        res = function(std::forward<TArgs>(args)...);

        return true;
    }
    catch (...) {
        return false;
    }
}

同样,您也不能像0引用一样传递参数TArgs&...照原样通过它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

使用可变参数模板(gcc,clang)的成员函数指针包装器

如何编写可变参数模板的递归函数?

编写可变参数模板构造函数

值包装器的可变参数模板构造函数的类构造函数优先级

如何正确使用可变参数模板函数

如何编写计算整数和的可变参数模板类的通用版本

如何重载可变参数模板函数?

如何传递可变参数模板函数?

用可变参数模板在C ++中包装函数指针

如何对可变参数模板函数的异构参数包进行通用计算?

使用可变参数模板进行C回调包装

使用可变参数模板的C ++通用命令解析器

如何使用可变参数模板参数进行模板函数调用?

如何访问可变参数模板函数中的参数

具有单个参数模板的成员函数包装器?

使用可变参数模板构建函数参数

使用成员函数调用可变参数模板函数

clang不使用可变参数推断可变参数模板函数中的模板参数

如何在可变参数模板函数中使用source_location?

如何为特定于类型的访问函数编写通用模板化包装器?

C ++可变参数模板构造函数和通用构造函数

如何使用可变参数模板使用std :: function

递归可变参数函数模板

基准可变参数模板函数调用

可变参数模板中的函数顺序

可变参数模板函数接受lambda

可变参数模板函数重载失败

我的基于可变参数模板的包装函数有什么问题?