C++17中的deduction guide

deduction guide可以根据参数自动推导出对应的类型,这可以让我们的代码变得更加简洁,看下面的写法:

从上面的例子中可以看到隐式的deduction guide可以让我们的代码写得更加简洁,不用再写模版参数等细节了,有一种写动态语言的感觉。

除了隐式的deduction guide,还有一种显式的deduction guide,作用和隐式deduction guide差不多,也是让写法变得更简洁。下面是显式deduction guide的例子:

如果没有通过Dummy(double) -> Dummy显式地做deduction guide,我们在定义Dummy的时候是需要显式带着模版参数的。也许有人觉得就为了省掉一个模版参数却要多定义一个显式的deduction guide,似乎还变麻烦了。其实显式deduction guide主要是为了简化定义可变模版参数的变量,之前介绍过通过std::visit来访问variant, 通过auto lambda和if constexpr来访问variant的做法不是很方便,我们可以通过可变模板和显式deduction guide的来实现一个访问variant的更好的方法。

上面的例子中先通过可变模版参数的CRTP获得参数的operater(),然后通过显式的deduction guide来省去定义含可变模版参数overloaded的变量时,需指定变参类型的麻烦,让代码变得非常简洁。这里不仅仅是让代码变得简洁,还直接避免了一个难题,因为overloaded参数是lambda,它是一个匿名类型,你无法获取lambda的类型并实例化overloaded模版。

《C++17中的deduction guide》有12个想法

  1. 请问为什么会出现这样的错误信息?
    D:\Codeblocks\C++ Projects\ACfun\main.cpp|5|error: no viable constructor or deduction guide for deduction of template arguments of ‘tuple’|
    代码如下:
    #include
    using namespace std;
    int main()
    {
    tuple tpl ( 1, 2, 3 );
    return 0;
    }

      1. 跟头文件没有关系(抱歉贴代码的时候把弄没了)
        编译器版本:LLVM Clang 5.0.0 (Win64),会不会是编译器自身的问题?

  2. 请问在visit_variant的代码示例中,第15行的overloaded是什么时候引入的特性,还是编译器的扩展或者某个第三方库的内容?我在cppreference上搜索不到相关的信息。

发表评论

Copy Protected by Chetan's WP-Copyprotect.