当前位置:  开发笔记 > 编程语言 > 正文

C++ 17类模板部分演绎

如何解决《C++17类模板部分演绎》经验,为你挑选了2个好方法。

我对类模板提议的模板参数推导的理解是在演绎上下文中使模板函数和模板类的行为同质化.但我认为我误解了一些事情.

如果我们有这个模板对象:

template 
struct test
{
    static constexpr auto size = S;
    using type_t = T;

    test(type_t (&input)[size]) : data(input) {}
    type_t (&data)[size]{};
};

我倾向于使用辅助函数作为创建对象的语法糖test:

template 
test helper(T (&input)[S]) { return input; }

可以使用如下所示:

int main()
{
    int buffer[5];

    auto a = helper<5, int>(buffer); // No deduction
    auto b = helper<5>(buffer);      // Type deduced
    auto c = helper(buffer);         // Type and size deduced

    std::cout << a.size << b.size << c.size;

    return 0;
}

上面的代码555按预期输出.我在Wandbox中使用较新的编译器设置1尝试了相同的操作:

int main()
{
    int buffer[5];

    test<5, int> a(buffer); // No deduction: Ok.
    test<5> b(buffer);      // Type deduced: FAILS.
    test c(buffer);         // Type and size deduced: Ok.

    std::cout << a.size << b.size << c.size;

    return 0;
}

看起来类模板的模板参数推导只能推导出所有参数,我期待两种行为(辅助函数和类模板)是相同的,我误解了什么?


1 Wandbox中可用的最后一个编译器是gcc HEAD 7.0.1 201701clang HEAD 5.0.0(trunk).



1> metalfox..:

根据Botond Ballo的优秀旅行报告:

最初提出的功能包括部分扣除的规定,其中您明确指定了一些模板参数,并将剩下的部分推断出去,但是在某些情况下可能会让人感到非常困惑:

// Would have deduced tuple,
// but tuple is a well-formed type in and of itself!
tuple t(42, "waldo", 2.0f);


我觉得这个推理很奇怪.首先,我们已经有了`std :: make_tuple (42,"waldo",2.0f);`一直认为这是错误的事情,并教导人们在推导出模板参数时指定它是错误的.现在通过禁止这一点,我们推断类模板以不同的方式工作作为函数一(不一致)并阻止大量有效的用例(不同于人为的元组示例).
@Predelnik:问题是现有的代码可以使用`A a(t,u,v)`和`V`的默认模板参数(或长度为2而不是3的参数包).你不敢默默地改变这样一个意思,即_依赖于一个完全可靠的演绎_Lck_.也许如果你只有明确的演绎指南,那就没问题了,但是对于隐含的演绎指南来说它太危险了.
@DavisHerring是打破现有的代码似乎是一个更好的理由,它仍然伤心不能够运用它的理智的用例。

2> Nicol Bolas..:

这里似乎有矛盾.看看P0091R3,似乎应该允许部分指定参数:

我们建议允许模板名称引用类模板作为简单类型说明符或在两个上下文中部分提供显式模板参数:

但是同一提案中的实际标准措辞并未提供处理"部分提供的显式模板参数"的方法.template-name因为simple-type-specifier不允许有模板参数.

因此,遵循规范本身,编译器的行为似乎是正确的.


是的,该文件特别是一个相当令人震惊的案例,即作者在措辞和设计修订时未能使介绍部分保持同步.不幸的是,结果是一个积极误导的介绍部分.
@MikelF:你认为他们实际上会允许部分规范.写作中的不协调表明这是委员会选择*删除*,而不是原作者只是在他的措辞中犯了错误.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有