gpt4 book ai didi

c++ - 从使用概念定义的函数返回新对象

转载 作者:行者123 更新时间:2023-12-01 17:52:27 25 4
gpt4 key购买 nike

代码

#include <type_traits>

template <typename N>
concept Number = std::is_arithmetic<N>::value;

template <typename T>
concept VectorXY = requires(T t)
{
{t.x} -> Number;
{t.y} -> Number;
};

template <Number N>
struct Vec2
{
N x = 0;
N y = 0;
};

VectorXY operator*(VectorXY v, Number n)
{
return {v.x * n, v.y * n};
// error: returning initializer list
}

int main()
{
Vec2<float> v = Vec2<float>{} * 1;
// error: conversion from 'void' to non-scalar type 'Vec2<float>' requested
}

神箭:https://godbolt.org/z/gYsQ5B

<小时/>

那么我该如何解决这个问题呢?

解释为什么编译器无法推断返回类型也会有帮助。

最佳答案

VectorXY不是一个类型。这个概念旨在检查从函数返回的表达式推导的类型。并且所述类型推导与推导函数参数的类型完全分开。

你返回的是

{v.x * n, v.y * n}

它是一个用大括号括起来的初始值设定项。当对其进行模板参数推导时,通常推导的是 std::initializer_list 。这样做的两个问题是,首先,没有包含相应的 header ,因此程序格式不正确。其次,即使包含 header std::initializer_list<float>不满足VectorXY概念。

您可以通过指定返回对象的类型来修复它,例如通过函数转换表示法

return decltype(v){v.x * n, v.y * n};

现在它是一个类型化表达式,根据该表达式,函数的返回类型被推导为满足 VectorXY 的类型。概念。

Live Example .

<小时/>

作为附录,GCC 尚未实现它,但正确的语法应该是

VectorXY auto operator*(VectorXY auto v, Number auto n)
{
return decltype(v){v.x * n, v.y * n};
}

鉴于仅使用 VectorXY 引起的困惑,我认为委员会要求这个限制是正确的auto语法代替。在这里,类型推导的发生对我来说更加明显。

关于c++ - 从使用概念定义的函数返回新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59558546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com