metaprogramming 相关问题

元编程是重新编程编程环境的能力,就像宏或元类一样。

如何将变量名作为字符串传递给函数? (Clojure 脚本)

情况描述 我想为某个元素制作一个表单模板,但它们必须动态创建。组件中涉及的元数据应该使用传递的变量名称...

回答 1 投票 0

如何使用DolphinDB的“unifiedExpr”将条件与“or”运算符组合?

我正在尝试利用DolphinDB的unifiedExpr函数将多个条件与or运算符组合起来。当我执行以下脚本时: 数据=表(1..6作为id1,7..12作为id2) 其中代码 = [...

回答 1 投票 0

我可以使用 C/C++ 预处理器添加数字吗?

对于一些基础。基数 1 偶数。某种复杂的替换-ing。 当然,在现实生产代码中这样做并不是一个好主意。我只是出于好奇才问的。

回答 8 投票 0

从可变参数模板生成 std::function 的 std::tuple

假设有一个像这样的函数 模板 void f(std::tuple & 数据); 我想生成一个 std::function 的 std::tuple,每个都有这个签名:std::function<

回答 1 投票 0

将结构体字段的类型扩展为可变参数模板参数

假设我有一个像这样的结构: 结构体 Foo { 整数a; 浮动b; 布尔c; }; 和这样的模板化函数: 模板 void func(); 我怎样才能编写一个函数......

回答 2 投票 0

编译时打开文件[JS后端]

我正在尝试在宏中打开文件,但出现异常: 此处“some”的模板/通用实例化 错误:无法在编译时“importc”变量;福彭 我的尼姆代码: 导入宏 宏索姆...

回答 1 投票 0

Python 具有继承性的分层数据结构

我想为分层数据结构创建一个元类,并编写一个框架供其他人使用。 我发现这个答案非常有帮助:https://codereview.stackexchange.com/a/162702/2754...

回答 1 投票 0

如何使用 if constexpr 根据向量的类型将一个向量移动或分配给另一个向量?

我想根据标量类型将 std::vector 移动或分配到 std::vector 中。 如果标量是浮动的则移动,否则复制。 我试过这段代码 #包括 我想根据类型 std::vector<Scalar> 将 std::vector<float> 移动或分配到 Scalar。 如果 Scalar 是 float 则移动,否则复制。 我试过这个代码 #include <vector> using Scalar = double; int main() { std::vector<Scalar> x(10); std::vector<float> y(10); if constexpr(std::is_same<Scalar, float>::value) y = std::move(x); // line 11 (does not compile) else y.assign(x.begin(), x.end()); return 0; } 但我明白了 main.cpp:11:24: error: no match for ‘operator=’ (operand types are ‘std::vector<float>’ and ‘std::remove_reference<std::vector<double>&>::type’ {aka ‘std::vector<double>’}) 11 | y = std::move(x); | ^ 我认为由于 std::is_same<Scalar, float>::value 在编译时被评估为 false,因此下面的行将不会被编译。 我使用g++ -std=c++17 main.cpp -o exec编译它。 如何根据 x 类型将 y 移动/分配到 Scalar? 因为main()不是模板,所以if constexpr两边都必须有效。要以这种方式使用 if constexpr,它需要位于模板中。 值得庆幸的是,一个好的模板使这个逻辑更可重用: #include <vector> template<typename T, typename U> void move_or_copy(std::vector<T>& dest, std::vector<U>&& src) { if constexpr(std::is_same_v<T,U>) dest = std::move(src); else dest.assign(src.begin(), src.end()); } using Scalar = double; int main() { std::vector<Scalar> x(10); std::vector<float> y(10); move_or_copy(y, std::move(x)); } 我们可以对模板函数进行更好的约束(允许任何集合作为源),但这至少应该提供正确的出发方向。 当 y = std::move(x); 不是 Scalar 时,赋值 float 无效,因为 y 是 std::vector<float> 类型,而 x 是 std::vector<Scalar> 类型,并且它们不直接兼容。 #include <vector> #include <type_traits> using Scalar = double; template <typename T, typename A> void moveOrAssign(std::vector<T>& dest, std::vector<A>&& source) { if constexpr(std::is_same_v<T, A>) { dest = std::move(source); } else { dest.assign(source.begin(), source.end()); } } int main() { std::vector<Scalar> x(10); std::vector<float> y(10); moveOrAssign(y, std::move(x)); return 0; } 正如 @HolyBlackCat 在评论中所指出的,以及 cppref 中所述:“在模板之外,会完全检查被丢弃的语句。” (https://en.cppreference.com/w/cpp/language/if)。 这是一种涉及新模板函数的潜在解决方案 template<typename U, typename V> std::vector<U>& move_or_copy(std::vector<U>& x, std::vector<V>& y) { static_assert(not std::is_same<U,V>::value); x.assign(y.begin(), y.end()); return x; } template<typename U> std::vector<U>& move_or_copy(std::vector<U>& x, std::vector<U>& y) { return x = std::move(y); }

回答 3 投票 0

如何使用 if constexpr 根据向量的类型将一个向量移动或分配给另一个向量?

我想根据标量类型将 std::vector 移动或分配到 std::vector 中。 如果标量是浮动的则移动,否则复制。 我试过这段代码 #包括 我想根据类型 std::vector<Scalar> 将 std::vector<float> 移动或分配到 Scalar。 如果 Scalar 是 float 则移动,否则复制。 我试过这个代码 #include <vector> using Scalar = double; int main() { std::vector<Scalar> x(10); std::vector<float> y(10); if constexpr(std::is_same<Scalar, float>::value) y = std::move(x); // line 11 (does not compile) else y.assign(x.begin(), x.end()); return 0; } 但我明白了 main.cpp:11:24: error: no match for ‘operator=’ (operand types are ‘std::vector<float>’ and ‘std::remove_reference<std::vector<double>&>::type’ {aka ‘std::vector<double>’}) 11 | y = std::move(x); | ^ 我认为由于 std::is_same<Scalar, float>::value 在编译时被评估为 false,因此下面的行将不会被编译。 我使用g++ -std=c++17 main.cpp -o exec编译它。 如何根据 x 类型将 y 移动/分配到 Scalar? 正如 @HolyBlackCat 在评论中所指出的,以及 cppref 中所述:“在模板之外,会完全检查被丢弃的语句。” (https://en.cppreference.com/w/cpp/language/if)。 这是一种涉及新模板函数的潜在解决方案 template<typename U, typename V> std::vector<U>& move_or_copy(std::vector<U>& x, std::vector<V>& y) { static_assert(not std::is_same<U,V>::value); x.assign(y.begin(), y.end()); return x; } template<typename U> std::vector<U>& move_or_copy(std::vector<U>& x, std::vector<U>& y) { return x = std::move(y); } 当 y = std::move(x); 不是 Scalar 时,赋值 float 无效,因为 y 是 std::vector<float> 类型,而 x 是 std::vector<Scalar> 类型,并且它们不直接兼容。 #include <vector> #include <type_traits> using Scalar = double; template <typename T> void moveOrAssign(std::vector<T>& dest, std::vector<T>&& source) { if constexpr(std::is_same_v<T, float>) { dest = std::move(source); } else { dest.assign(source.begin(), source.end()); } } int main() { std::vector<Scalar> x(10); std::vector<float> y(10); moveOrAssign(y, std::move(x)); return 0; }

回答 2 投票 0

如何查看 NimNode 的内容?

我正在使用 nim 编程语言并正在进行一些元编程。 我想编写某种能够生成过程的 DSL。为此,我想将一些 nim 代码传递到宏中(例如

回答 1 投票 0

C++:您使用 Loki 还是 Boost 作为函子吗?

我一直在阅读 Alexandrescu 的书《Modern C++ design》,他使用的技术给我留下了深刻的印象,所以我想将 Loki 库添加到我的应用程序中。 然而,进一步

回答 4 投票 0

TypeList 的 Loki IndexOf 实现

我正在实现一个基于 Loki 的 TypeList,基于阅读: http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s09.html 并从 IndexOf 网站上看到了这段代码(在...中查找类型的索引

回答 1 投票 0

在DolphinDB中使用元编程时无法执行连接操作

我想通过使用SQL元数据代码的连接操作在表中的某些列之后添加自定义指标。但是当我执行执行的元代码时,却报错了。这是...

回答 1 投票 0

为什么我应该在 C++ 中使用函数而不是命名 lambda

最近我在函数推导方面遇到了很多困难,当然 lambda 在这里被证明更灵活,但这样做我遇到了一个问题,为什么我应该使用函数而不是命名 lambda?...

回答 1 投票 0

当你有代表实例变量的符号时,如何检查实例变量是否已设置?

我想使用remove_instance_variable(instance_variable),其中instance_variable包含以下形式的符号:@some_variable,但首先我想验证实例变量(例如@

回答 1 投票 0

将引用传递到 Rust 中的过程宏

我们举个例子,在编译时计算整数序列的中位数。 我已经用 C++ 和 Rust 实现了它。 C++:https://gist.github.com/jymchng/

回答 1 投票 0

如何编写一个概念来检查 std::tuple 的所有类型中的内部类型?

继续我对 C++ 20 概念的研究,我正在尝试编写一个概念,以确保 std::tuple 中的每个类型都具有用特定名称定义的内部类型,并且所有内部...

回答 3 投票 0

如何编写一个概念来检查 std::tuple 的所有类型中的内部类型?

继续我对 C++ 20 概念的研究,我正在尝试编写一个概念,以确保 std::tuple 中的每个类型都具有用特定名称定义的内部类型,并且所有内部...

回答 3 投票 0

C# 中的高级元编程是否有一些行业“标准”?

时不时地,在各种项目中,我会遇到无法用泛型解决的 C# 项目中的元编程情况,并且会受益于更强大的元编程......

回答 4 投票 0

我可以推断可调用对象的参数吗?

我正在编写一个面向数据的编程注册表,它看起来有点像 ECS 注册表,并且工作方式如下: void KillEnemy(EnemyList &enemies, ProjectileList &projectiles); int main() {...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.