metaprogramming 相关问题

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



C++ 20包装成员功能的地图

出于意图,请在下面检查澄清: 我有一个具有多个成员功能的课程。每个参数数量不仅具有不同的参数,还具有不同的返回类型。 假设我的班级喜欢...

回答 1 投票 0

在编译时与其他容器的字符串类型[重复]

例如,我有此类: 模板 类TlvParser { 民众: tlvparser(t值) :value_(std :: move(value)){ } void parse(const std ::span 例如,我有此类: template <typename T, U> class TLVParser { public: TLVParser(T value) : value_(std::move(value)) { } void parse(const std::span<uint8_t>& buffer, size_t& offset) { if constexpr (std::is_arithmetic_v<T>) { return parsePrimitive(buffer, offset); } else if constexpr (std::is_same_v<T, std::string> || std::is_same_v<T, std::string_view>) { return parseStringView(buffer, offset); } else if constexpr (std::is_same_v<T, std::span<U>> || std::is_same_v<T, std::vector<U>>) { return parseContainer(buffer, offset); } else { static_assert(always_false<T>::value, "Unsupported type for TLV parsing"); } } private: T value_; }; 我了解,string_view,std::string,std::vector和std::span具有一些我可以制作相同解析功能的常见属性。因此,是否有一种方法可以使用if constexpr检查这种类型是否是这样的容器,而无需为每个类型编写||,并且仅使用一个概念来确保该容器应该具有特定的属性,例如能够范围循环? 我的第二个问题是我可以为std::span<uint8_t>参数制作打字名称,以便我可以使用std::vector,std::array甚至uint8_t*或char*?? 在评论中已经指出了几个人,确定什么构成“container”通常是问题所在。一种方法是检查它是否支持“STD:: begin()”和“STD:: end()”,它还处理C风格阵列,而不是仅检查具有成员的类“Begin()”和“ iande c-end()i忽略C-C-Style Arrays)。 但是,由于我不会进入此处的原因,我更喜欢它(对于C ++ 17及以后的原因,尽管可以稍作调整以处理早期版本)。它只需检查它是否是具有“iterator”或“const_iterator”别名(typeDef)的类。宏的使用是丑陋的,但它只是为了创建检查“titerator”或“const_iterator”的类型安全代码(并且可以使用宏来创建型号安全的“安全”hasmembertype_?“也可以检测任何其他类型的dype andive nifection dycection dycection nife dection nife dection nife nife nive nofe of of of of oferalto anditorator of”IteratorToratorToratorToratorToratorToratorToratorToratorConcontorator当然也可以使用概念(在C ++ 20中),因此您还可以创建一个概念,如果您愿意,只能为“iscontainer_v”进行辩护(请参见下面)。对于那些想要实施更现代的东西的人也可能会利用一些“STD”概念类别Herey。 nyway,以下代码没有资格获得标准本身,但在实践中运行良好(是的,它可以处理“Std::string”(如果需要),因为它具有必要的迭代器别名)。 单击运行它。 #include <type_traits> #include <vector> #include <iostream> #define DECLARE_HAS_MEMBER_TYPE(NAME) \ template <typename, typename = void> \ struct HasMemberType_##NAME : std::false_type \ { \ }; \ template <typename T> \ struct HasMemberType_##NAME<T, std::void_t<typename T::NAME>> : std::true_type \ { \ }; \ template <typename T> \ inline constexpr bool HasMemberType_##NAME##_v = HasMemberType_##NAME<T>::value; DECLARE_HAS_MEMBER_TYPE(iterator) DECLARE_HAS_MEMBER_TYPE(const_iterator) template <typename T> using IsContainer = std::bool_constant<HasMemberType_const_iterator_v<T> || HasMemberType_iterator_v<T> || std::is_array_v<T>>; template <typename T> inline constexpr bool IsContainer_v = IsContainer<T>::value; int main() { std::cout << std::boolalpha << IsContainer_v<std::vector<int>> << "\n"; // true std::cout << std::boolalpha << IsContainer_v<int []> << "\n"; // true (C-style array) std::cout << std::boolalpha << IsContainer_v<int *> << "\n"; // false (pointer not considered a container) return 0; }

回答 1 投票 0


在调试模式下constexpr函数的compile-time评估

我一直在玩以下代码片段以了解< 2)

回答 1 投票 0

有一个类似于#继承类的钩子,仅在红宝石类定义后才触发?

#继承在类foo语句之后立即调用。我想要只有在结束班级声明的结束语句之后才能运行的东西。 这是一些代表我需要的代码: C ...

回答 7 投票 0

使用 Tidyverse Defusing Operators 创建未评估的调用

假设我有以下数据结构: 图书馆(dplyr) d <- tibble(x = paste0("x", 1:3), op = c("f", "g", "h"), y = paste0(&...

回答 4 投票 0

可调用签名匹配,禁止参数隐式转换

我正在使用一些“元方法”来执行编译时调用签名检测。虽然这个解决方案对我有用,但这只是因为我选择了相当具体的签名......

回答 1 投票 0

如何在 Scala 3 元编程中创建泛型类的实例

我想使用 Scala 3 进行简单的服务发现。 我为此使用元编程。 特质我的特质 案例类 ClassA() 扩展 MyTrait 案例类 ClassB() 扩展 MyTrait 所以它应该实例化

回答 1 投票 0

Ruby:如何将多个方法调用与“发送”链接在一起

必须有一种内置的方法来做到这一点,对吧? 对象类 def send_chain(arr) o=自我 arr.each{|一个| o=o.send(a) } 返回o 结尾 结束

回答 5 投票 0

不明白模板参数是函数调用

我正在尝试理解一些模板代码。 我已将代码减少到最基本的部分。但我不明白提供给函数 mangledName() 的模板参数的含义...

回答 1 投票 0

C++ 模板字符串连接

我正在尝试定义一些可变参数模板,如下所示: typedef const char CCTYPE[]; 模板 struct StringConcat { ... }; 这样我就可以写出这样的东西: char foo[] ...

回答 5 投票 0

Scala 3 - 元编程 - 如何匹配 Array[Int] 类型的子表达式?

我正在学习 Scala 多阶段元编程。 我目前正在做一项练习,要求我实现两个相同长度向量之间的点积(积和)。 写c...

回答 1 投票 0

Scala 3 - 反射 API - 类型定义不是 Reflect 的成员

我目前正在从这本书中学习Scala多阶段编程 Scala 3 中的可扩展元编程,取自作者网站 https://github.com/nicolasstucki/nicolasstucki/raw/main/Scala...

回答 1 投票 0

Lua 中 JavaScript 的 proxy.apply 处理程序

在 JavaScript 中,您可以创建一个可调用的对象,如下所示: const prox = new Proxy(function() {}, { 获取(目标,键){返回true} apply(target, that, argList) { console.log('这来了...

回答 1 投票 0

C++ 编译器输出

我想知道是否有一个工具/GCC 编译开关可以用来在运行前查看 GCC 编译器的跟踪/输出。一般来说,我希望有一个注释工具...

回答 1 投票 0

如何在 C++ 中以元组形式获取构造函数参数类型?

无法检索元组中的构造函数参数。 我试图将给定类的构造函数参数类型提取为 std::tuple。例如,如果我有一个这样的课程: 结构 MyClas...

回答 1 投票 0

自动将枚举成员的值设置为其名称

我一直在摆弄Python的枚举库并遇到了一个难题。在文档中,他们展示了自动编号枚举的示例,其中定义了某些内容: 类颜色(自动编号...

回答 3 投票 0

如何强制程序员实例化模板?

这是一些模板 constexpr 函数。 模板 constexpr void function(); 我想强制程序员使用特定的模板参数实例化函数。 模板无效

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.