metaprogramming 相关问题

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

如何在DolphinDB中通过元编程编写<rowAvg(bid1, bid2, bid3, bid4) as bidavg >语句?

周期=1..4 sqlColAlias(makeCall(rowAvg, sqlCol(take(`bid, size(period)) + string(period))), `bidavg) 结果: < rowAvg([< bid1 >,< bid2 >,< bid3 >,< bid4 >])作为出价...

回答 1 投票 0

如何知道类型是否是 std::vector 的特化?

我整个早上都在解决这个问题,但没有任何结果。 基本上,我需要一个简单的元编程,如果传递的参数是...,它允许我分支到不同的专业化。

回答 5 投票 0

找到可以数到N的最小整数类型

我想要一个 C++03 中的解决方案,它允许我选择一种能够容纳最多 N 的整数,同时尽可能保持最小的类型。 基本上我只需要打电话

回答 3 投票 0

获取传递给模板的结构成员的类型

本质上我很好奇我可以使用多少模板: 假设我有两个没有共同成员的结构 结构体A{ 整数 k; 字符l; std::string s; }; 结构体B{ 长h; 佛罗里达...

回答 1 投票 0

类如何声明其所有可变参数模板参数?

如果我有一个类采用模板参数的可变参数包,我怎样才能将它们声明为朋友? 这是我想以伪代码形式执行的操作: 模板 班级

回答 2 投票 0

检查可调用签名参数是否是任何指针类型或可转换为特定类型?

我正在使用宏来进行编译时签名匹配,如下所示: #define ifSigMatch(sig) if constexpr (std::is_same_v(f)}), std::function 我正在使用宏来进行编译时签名匹配,如下所示: #define ifSigMatch(sig) if constexpr (std::is_same_v<decltype(std::function{std::forward<Foo>(f)}), std::function<sig>>) template <class T, class Foo> void afoo(Foo f) { ifSigMatch(void(T)) { ... } ifSigMatch(bool(T)) { ... } ifSigMatch(bool(T, int)) { ... } ... } 有没有办法处理Foo的第一个输入参数是任何指针类型的情况,或者参数可以隐式转换为T,而不需要向afoo添加更多模板参数? 最好是 c++17 或更低版本。 要处理 Foo 的第一个输入参数是任何指针类型或可隐式转换为 T 的情况,您可以将 SFINAE(替换失败不是错误)与 std::enable_if 结合使用。以下是您如何修改宏和模板函数afoo以实现此目的,而无需添加更多模板参数: #include <functional> #include <type_traits> #define ifSigMatch(sig) if constexpr (std::is_invocable_v<Foo, sig>) template <class T, class Foo> void afoo(Foo f) { ifSigMatch(T*) { ... } else ifSigMatch(std::enable_if_t<std::is_convertible_v<std::invoke_result_t<Foo, T>, T>, T>) { ... } else ifSigMatch(bool(T)) { ... } else ifSigMatch(bool(T, int)) { ... } // Add more conditions as needed // ... } 您可以使用具有类模板专门化的辅助类来获取返回类型和参数类型,然后在 constexpr 方法中使用它们来比较签名。 如果您想允许返回类型可转换为您指定的类型,可以使用 std::is_convertible_v 代替 std::is_same_v。 #include <type_traits> template <typename> struct Function; // This primary template is not defined. template <typename R, typename... Args> struct Function<R(Args...)> { template <typename Foo> constexpr bool matchesSig() { if constexpr (std::is_invocable_v<Foo, Args...>) { // only return true when the return type is EXACTLY as specified // otherwise, ifSigMatch(bool(T)) would also always imply // ifSigMatch(void(T)) to be true return std::is_same_v<std::invoke_result_t<Foo, Args...>, R>; } return false; }; }; #define ifSigMatch(sig) if constexpr (Function<sig>().template matchesSig<Foo>())

回答 2 投票 0

类主体中类的Python名称

是否可以在类定义主体中获取类名? 例如, 类 Foo(): x = magic() # x 现在应该是 'Foo' 我知道我可以在...之外静态地执行此操作

回答 6 投票 0

如何将 Julia 结构完全解压到局部变量中?

我创建了一个包含大量参数的复杂计算模型。由于我需要运行许多场景,因此我决定将所有这些输入参数包装到一个巨大的结构中: 使用参数 @w...

回答 5 投票 0

模板参数推演(多参数模板)

我需要创建自己的 std::map 实现,但可以在仅使用一个模板参数创建键时推断出键的类型。 模板 M 班...

回答 1 投票 0

实现C++模板来生成给定范围的索引序列

所以,C++14提供了struct make_index_sequence来生成从0到N-1的索引序列。我想知道如何实现一个来生成给定范围内的索引序列。例如...

回答 2 投票 0

如何从类中的方法动态创建模块级函数

我正在尝试从类中的方法动态创建模块级函数。因此,对于类中的每个方法,我想创建一个具有相同名称的函数,该函数创建...

回答 3 投票 0

C++ 元编程检查类型是否存在

下面的源代码摘自MongoDB。 据我所知, detector_clone_factory_type_member_impl 的目的是检查类型 T 是否拥有 clone_factory_type 。怎么...

回答 1 投票 0

Rails 应用程序中多个请求之间的会话变量

我在我的rails应用程序中,我正在控制器方法中的子过程中设置会话的值,然后重定向到静态页面,该静态页面最终重定向到我的最终控制器/行为...

回答 2 投票 0

计算模板模板类型的参数

以下代码适用于 GCC(至少在 GCC 10.1.0 中),但不适用于 MSVC 和 Clang。我不确定它在 C++ 标准中是否合法。 我正在尝试计算模板模板类型中的参数。 是

回答 6 投票 0

使用 Zig 中的 comptime 值格式化字符串

我正在尝试创建一个仅接受长度为4的内置向量(如@Vector)的多态函数。据我了解,向量的长度是已知的,我想广告......

回答 1 投票 0

C# 中的猴子修补

是否可以在运行时扩展或修改 C# 类的代码? 我的问题特别围绕 Monkey Patching / Duck Punching 或元对象编程 (MOP),正如它发生在

回答 5 投票 0

是否可以在运行时将子例程附加到 Raku 模块?

我希望能够在运行时向模块 Foo 添加一个子模块。 在 Perl 中,我会做类似的事情: *{'My::Module::foo'} = \sub { 'FOO!' }; 我知道 Raku 没有像 Perl 那样的 TypeGlobbing。理想...

回答 1 投票 0

是否可以使用 constexpr if 来检查类型是容器还是 std::string

例如我有这样的课程: 模板 TLV解析器类 { 民众: TLVParser(T 值) : value_(std::move(value)) {} 无效解析(const std::span &buffer,

回答 1 投票 0

我可以从类型列表声明模板实例化吗?

很确定我已经知道答案了,但值得一试。 所以,假设我有一个类型列表: 模板 结构类型列表{}; 其中包含一些对象: 结构体foo{}; 斯特...

回答 6 投票 0

通过 C++ 元编程在编译时自动为每个模板专门化分配索引?

比如我想实现一个这样的模板函数: 模板 int GetTypeIndex() {} 它总是为相同的“T”返回行列式从零开始的索引,最后......

回答 1 投票 0

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