c – 为什么结构体不能作为模板非类型参数的值传递?

c – 为什么结构体不能作为模板非类型参数的值传递?,第1张

概述非类型模板参数显然不是类型,例如: template<int x>void foo() { cout << x; } 在这种情况下,还有其他的选项比int,我想参考this great answer. 现在,有一件事我错了:structs.考虑: struct Triple { int x, y, z; };Triple t { 1, 2, 3 };template<Triple con 非类型模板参数显然不是类型,例如:
template<int x>voID foo() { cout << x; }

在这种情况下,还有其他的选项比int,我想参考this great answer.

现在,有一件事我错了:structs.考虑:

struct Triple { int x,y,z; };Triple t { 1,2,3 };template<Triple const& t>class Foo { };

现在,使用正常的非类型引用语义,我们可以写:

Foo<t> f;

值得注意的是,t不能是constexpr或const,因为这意味着内部链接,这基本上意味着该行将不会编译.我们可以通过将t声明为const extern来绕过它.这本身可能有点奇怪,但真正让我想知道的是为什么这是不可能的:

Foo<Triple { 1,3 }> f;

我们从编译器得到一个非常好的错误:

error: Triple{1,3} is not a valID template argument for type const Triple& because it is not an lvalue.

我们无法通过值指定Triple在模板中,因为这是不允许的.但是,我不明白这一小代码的真正问题.什么是不允许使用结构体作为价值参数的原因.如果我可以使用三个int,为什么不是三个int的结构体?如果它只有微不足道的特殊成员,处理不应该只是三个变量.

@H_404_30@解决方法 我认为“因为mikta是一个痛苦的指明正确和实施”是我们没有这个的主要原因.当然,这样做很容易,但是人们会抱怨如何使用struct template参数在所有相同的情况下都不起作用,其他模板参数会做(考虑部分专业化,或者 *** 作符== ).

在我看来,弄得整个蛋糕太乱了,只有一个小小的片段不够满意,可能更令人沮丧.做这个微小的工作不会给我更多的权力,而不是像下面这样的东西,这具有与开箱即用的各种东西(包括部分专业化)的额外优势.

template <int X,int Y,int Z>struct Meta_triple {    // static value getters    static constexpr auto x = X;    static constexpr auto y = Y;    static constexpr auto z = Z;    // implicit conversion to Triple     constexpr operator Triple() const { return { X,Y,Z }; }    // function call operator so one can force the conversion to Triple with    // Meta_triple<1,3>()()    constexpr Triple operator()() const { return *this; }};
@H_404_30@ @H_404_30@ 总结

以上是内存溢出为你收集整理的c – 为什么结构体不能作为模板非类型参数的值传递?全部内容,希望文章能够帮你解决c – 为什么结构体不能作为模板非类型参数的值传递?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存