我想要一个可以接受固定值类型的任何范围/视图的函数。
int main()
{
std::array<std::pair<int, int>, 2> a{...};
std::array<std::pair<int, int>, 3> b{...};
generic_fun(a);
generic_fun(b);
};
Run Code Online (Sandbox Code Playgroud)
我当然可以
template <std::ranges::range R>
requires std::same_as<std::ranges::range_value_t<R>,std::pair<int,int>>
auto generic_fun(R range)
{
for(const auto& element : range)
return element.first;
}
Run Code Online (Sandbox Code Playgroud)
但 Visual Studio IDE 不知道element.
我期望范围库有类似的类型
template <typename T>
struct view
{
template <std::ranges::range R>
requires std::same_as<std::ranges::range_value_t<R>, T>
view(R);
T* begin() const;
T* end() const;
};
Run Code Online (Sandbox Code Playgroud)
这会给我 ide 支持
auto generic_fun(view<std::pair<int,int>> a)
{
for (const auto& b : a)
return b.first;
}
Run Code Online (Sandbox Code Playgroud)
为什么范围库中不存在这样的类型?定义一个抽象出除范围/迭代器的值类型之外的所有类型的类型在技术上是不可行的吗?或者没有人关心这样做,因为唯一的原因是 ide 支持? …
在我的回答中,巴里指出最好打电话,views::transform(&Planter::getPlants)因为views::transform([](Planter const& planter){...不小心复制了。
#if 1
auto plants = planters
| std::views::transform([](Planter const& planter){ return planter.getPlants();})
| std::views::join
| std::views::common
;
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
#else
auto plants = planters
| std::views::transform(&Planter::getPlants)
| std::views::join
;
#endif
// Plant copy constructor
// Plant copy constructor
Run Code Online (Sandbox Code Playgroud)
这Plant是一个围绕的包装器int,Planter也是一个围绕的包装器std::vector<int>。
在发现您可以符合人体工程学地将 s 转换 std::vector为固定大小的std::spans 后,我想我应该尝试以下结构化绑定std::vector:
auto _ = std::vector{ 1,2,3 };
std::span<int, 3> a = std::span(_).first<3>();
auto [b,c,d] = a;
Run Code Online (Sandbox Code Playgroud)
但它不起作用https://godbolt.org/z/nhrYn65dW
然而,从P1024 std::span 的可用性增强看来,这应该是合法的
添加对固定大小跨度的结构化绑定支持?一致同意
通常 decltype 保留 ref 限定符
auto a = 0;
auto& a_ref = a;
static_assert(std::is_reference_v<decltype(a_ref)>);
Run Code Online (Sandbox Code Playgroud)
但当它的参数是从结构化绑定获得时显然不是
auto a = 0;
auto& a_ref = a;
static_assert(std::is_reference_v<decltype(a_ref)>);
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/qWT574fr9
我很确定,i并且d是这里的参考。它们应该是根据旧的新事物,智能感知是这样告诉我的。
我正在尝试计算一个反转的views::partial_sum. 下面的代码给出了非反转的partial_'min'的预期结果,但我需要使用它ranges::to_vector来取消views::reverse最终结果(因为你不能views::reversea views::partial_sum)。但是,当第二个to_vector未注释时,views::valuesofintermediate2全部为零(尽管键计算正确)。取消注释第一个to_vector可以解决此问题,但我想知道为什么?我是否有可能避免第一个to_vector?或者我是否应该不理会理解而只是插入to_vectors 直到代码起作用。
auto input = std::vector<float>{} | actions::push_back(views::iota(0u, COUNT)) | actions::shuffle(std::default_random_engine{});;
auto intermediate1 = views::zip(views::iota(0u, COUNT), input)
//| to_vector
;
auto intermediate2 = intermediate1
| views::reverse
| views::partial_sum(
[](std::pair<unsigned, float> a, std::pair<unsigned, float> b)
{
if (a.second > b.second)
return b;
else
return a;
})
//| to_vector
;
auto ans = intermediate2
//| views::reverse
;
std::cout << …Run Code Online (Sandbox Code Playgroud) 这是一些 ghci
> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
> :t allEqual
allEqual :: Eq a => [a] -> [a] -> Bool
> :t allEqual <*> reverse
allEqual <*> reverse :: Eq a => [a] -> Bool
> :t reverse
reverse :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
我正在尝试弄清楚 中应用程序的实例到底是什么allEqual <*> reverse。
我试图推理
f (a -> b) :: [a] -> [a] -> Bool
f a :: [a] -> [a]
f …Run Code Online (Sandbox Code Playgroud) 我想混合 co_yielding 字符串文字和std::strings
Generator<std::string_view> range(int first, const int last) {
while (first < last) {
char ch = first++;
co_yield " | ";
co_yield std::string{ch, ch, ch};
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道 std::string 的生命周期?
如果您知道要string_view立即食用,也许是安全的?
for(auto sv : range(65, 91))
std::cout << sv;
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/d5eoP9aTE
你可以像这样保证安全
Generator<std::string_view> range(int first, const int last) {
std::string result;
while (first < last) {
char ch = first++;
co_yield " | ";
result = std::string{ch, ch, ch};
co_yield result;
}
}
Run Code Online (Sandbox Code Playgroud) 根据 cppwinrt、迁移 C++... 的主文档,“设置 Windows 运行时属性值的等效 C++/WinRT 源代码调用与 Windows 运行时属性同名的方法以及新值的参数:
record.UserState(newValue); // Set the UserState property
Run Code Online (Sandbox Code Playgroud)
但是,当尝试设置 Duration 对象的 TimeSpan 属性时,这似乎不起作用:
TimeSpan ts = TimeSpan(6000000);
Duration duration = Duration();
duration.TimeSpan(ts);
Run Code Online (Sandbox Code Playgroud)
第三行在“duration”上产生一个智能感知错误:“调用类类型的对象,而没有适当的运算符或将函数转换为指针函数类型。” 同一行的构建错误是“Term 不计算为采用 1 个参数的函数”。我应该补充一点,Duration 的构造函数似乎有一个参数,即 TimeSpan,但这也不被接受。使用 cppwinrt 时如何设置 Duration 的 TimeSpan 属性?
我想要具有接受任何固定类型容器的功能。例如,一个函数将接受std::array<float,1>和std::array<float,2>。
我认为这在范围内是可能的,但我意识到我的理解非常肤浅。
我可以不使用模板吗?
编辑:我们可以使用范围库定义一个类型,该类型将执行与跨度相同的操作,但适用于非连续容器?也许我没有正确表达我的问题,我可能指的是视图而不是容器。
c++ ×7
c++20 ×4
std-ranges ×4
c++-concepts ×1
c++-winrt ×1
c++23 ×1
coroutine ×1
decltype ×1
haskell ×1
iterator ×1
range-v3 ×1
type-traits ×1