模板元编程是一种元编程技术,其中编译器使用模板生成临时源代码,该代码由编译器与其余源代码合并然后编译。
我正在为 C++17 实现我自己的 std::expected 类似物,并且我正在编写一个方法,该方法接受一个函数并在成功的预期值上调用它。如果预期有错误,
我正在实现一个简单的通用函子类,它可以存储函数及其参数,因此可以稍后调用。该函数可以是自由函数或 cl 的成员函数...
有些事情告诉我答案是“不”,但我想我还是会问。 我想在宏中检查特定表达式是否依赖于类型。这是一个激励人心的例子: #包括<
嗨,我使用 boost::pfr 进行基本反射,它工作正常,但问题是它只是打印或处理字段值,就像 boost::pfr::io 一样,它打印结构,但是如何...
C++ 模板与 OOD 困境 - 我怎样才能绕过实现“模板化类成员变量”之类的东西?
我试图使用模板来节省大量代码重复。 理想情况下,我想做一些类似的事情(我知道它的垃圾代码): 类注册表{ 民众: 模板 我试图使用模板来节省大量代码重复。 理想情况下,我想做一些类似的事情(我知道它的垃圾代码): class Registries { public: template<typename T> void AddToRegistry(T thing) { registry.push_back(thing); } template<typename T> std::vector<T>* GetRegistry<T>() { return ®istry(); } private: template<typename T> std::vector<T> registry; // auto-magically created vectors for each used type }; int main() { Registries registries; CoolThing thing1; NiceThing thing2; // ... Many N types registries.AddToRegistry(thing1); registries.AddToRegistry(thing2); std::vector<CoolThing>* cool_registry = registries.GetRegistry<CoolThing>(); std::vector<NiceThing>* nice_registry = registries.GetRegistry<NiceThing>(); } 它当然不起作用,因为我无法模板化类成员 - 不会为每种类型创建变量,并且这些函数不知道要返回哪个): 我可以这样做,但它们都会存储在静态内存中(不理想): class CoolThing { public: static std::vector<CoolThing> registry; }; class NiceThing { public: static std::vector<NiceThing> registry; }; class Registries { public: template<typename T> void AddToRegistry(T thing) { T::registry.push_back(thing); } } int main() { Registries registries; registries.AddToRegistry(CoolThing()); registries.AddToRegistry(NiceThing()); // ... Many N types } 我还在模板中尝试了 switch 和 if-else,但它们似乎不兼容: class CoolThing { public: const static ThingType TYPE = COOL; }; class NiceThing { public: const static ThingType TYPE = NICE; }; class Registries { public: template<typename T> void AddToRegistry(T thing) { switch (T::TYPE) { case ThingType::COOL: cool_registry.push_back(thing); return; case ThingType::NICE: nice_registry.push_back(thing); return; default: return; } } template<typename T> std::vector<T>* GetRegistry<T>() { if (T::TYPE == ThingType::COOL) { return &cool_registry; } else if (T::TYPE == ThingType::NICE) { return &nice_registry; } return nullptr; } private: std::vector<CoolThing> cool_registry; std::vector<NiceThing> nice_registry; // ... Many N types }; int main() { Registries registries; CoolThing thing1; NiceThing thing2; // ... Many N types registries.AddToRegistry(thing1); registries.AddToRegistry(thing2); std::vector<CoolThing>* = registries.GetRegistry<CoolThing>(); std::vector<NiceThing>* = registries.GetRegistry<NiceThing>(); } 我觉得我的选择是静态方式,或者编写一长串(20+类型)函数重载以添加到正确的注册表类型。 任何模板专家都知道替代方案吗? 非常感谢 您最可能寻找的是模板专业化。您可以在模板化定义上定义特定类型案例的行为。 class Regs { public: template<typename T> void AddRegister(T t) { ... } // Generic Case template<> void AddRegister<CoolThing>(CoolThing ct) { ... } // When T is CoolThing template<> void AddRegister<NiceThing>(NiceThing nt) { ... } // When T is NiceThing };
C++20 - 如何将模板参数包参数限制为“链”序列,例如F<A,B>、F<B,C>、F<C, D>?
假设我有两门课: 模板 类函子 {}; 模板 类模板 {}; 模板有
c++20 - 如何将模板参数包参数限制为“链”序列,例如F<A,B>、F<B,C>、F<C, D>?
假设我有两门课: 模板 类函子 {}; 模板 类模板 {}; 模板有
我有以下状态机示例,它使用枚举来专门化带有可变参数包的模板方法。当我通过
我正在寻找一种非递归的现代方法(至少可以使用 gcc 和 clang 进行编译)来查找可变参数包的第 𝑛 个元素。事实上,这似乎是一个解决方案,使用...
由于布尔类型模板函数中未使用参数,如何在 C++ 中拥有备用函数签名?
我的目标是有一个库提供我的函数增量的多个实例,基于唯一的定义以避免代码冗余: 模板 int 增量(int a, int b) { 如果
C++ constexpr 和 std::is_contant_evaluated 之间的交互
在 CppNow 演讲中(Don’t constexpr All the Things - David Sankel),它使用以下函数作为示例: constexpr int f() { if constexpr (std::is_constant_evaluated()) { // 慢
我正在尝试构建一个类模板,其中一个静态方法需要在模板参数中指定 typedef。 目标是指定一个像这样的 typedef typedef foobar = void __stdcall ...
我编写了以下在编译时使用字符串的代码: 模板 结构体 CnstString { 模板 使用push_back = CnstString 我编写了以下代码以在编译时使用字符串: template<char... Chars> struct CnstString { template<char... Aped> using push_back = CnstString<Chars..., Aped...>; constexpr static char value[] = {Chars...}; }; 我这样使用就可以了: #include <iostream> using str = CnstString<'H', 'e', 'l', 'l', 'o', '\0'>; int main() { std::cout << str << std::endl; return 0; // it will output "Hello" } 我想做的是使用递归模板结构体,在编译时拼接上面代码给出的字符串,并在递归终点处向数组追加一个'\0'。 我写这段代码的原因是因为我想多次连接同一个字符串。显然我不能像"Hello""Hello"那样将相同的字符串连接在一起。 递归模板结构如下所示: template<int N, typename Str> struct RepeatStr { using ret = RepeatStr<N-1, Str>; // this is an error, I don't know how to pass parameters }; template<typename Str> struct RepeatStr<-1, Str> { using ret = Str::push_back<'\0'>; }; 但是,我发现我不知道如何使用Str中的字符向自身追加字符。 有什么问题吗?或者它根本不可能在编译时完成? 您需要在 using 声明中添加关键字 template 来告诉编译器 push_back 使用模板。 template<int N, typename Str> struct RepeatStr { using ret = RepeatStr<N-1, Str>; }; template<typename Str> struct RepeatStr<-1, Str> { //--------------------vvvvvvvv------------------->works now using ret = Str:: template push_back<'\0'>; }; 工作演示
C++11:用另一个 constexpr char 数组初始化 constexpr char 数组
我想用另一个 constexpr char [] 成员初始化 constexpr char[] 成员。可以用C++11或以上版本实现吗? #包括 结构基{ static constexpr char Va...
我正在尝试完成模板元编程练习文本。但是,当我尝试部分特化非类型模板参数时,我会遇到不同的行为。 我定义了一个编译时向量...
我正在用 C++ 编写模板元编程代码,以生成用于嵌入式编程目的的查找表(缺少 FPU)。我一直在使用 MSVC 进行原型设计。 当尝试生成最终的
模板 结构体有_类型; 模板 结构 has_type> : std::false_type {}; 模板 template<typename T, typename Tuple> struct has_type; template<typename T> struct has_type<T, std::tuple<>> : std::false_type {}; template<typename T, typename U, typename... Ts> struct has_type<T, std::tuple<U, Ts...>> : has_type<T, std::tuple<Ts...>> {}; template<typename T, typename... Ts> struct has_type<T, std::tuple<T, Ts...>> : std::true_type {}; template<typename T, typename Tuple> using tuple_contains_type = typename has_type<T, Tuple>::type; using FooTuple = std::tuple<int, float, bool>; struct Foo : FooTuple { using TupleType = FooTuple; }; int main() { // this compiles if constexpr (tuple_contains_type<float, Foo::TupleType>::value) { // ... } // this does not if constexpr (tuple_contains_type<float, Foo>::value) { // ... } return 0; } 第一种情况可以编译,第二种情况则不能。我针对失败案例收到的错误是: error C2794: 'type': is not a member of any direct or indirect base class of 'has_type<float,Foo>' note: see reference to alias template instantiation 'tuple_contains_type<float,Foo>' being compiled error C2938: 'tuple_contains_type' : Failed to specialize alias template error C2039: 'value': is not a member of '`global namespace'' error C2059: syntax error: ')' error C2143: syntax error: missing ';' before '{' 到期贷记; has_type 和 tuple_contains_type 的模板来自:How do I find out if a tuple contains a type? 问题是struct has_type<float, Foo>没有定义。模板实例化不会调用重载查找和转换。
我有以下代码: #包括 #包括 #包括 #包括 #包括<...
我有一个像这样的参数类: 模板 类参数 { 值 v; ... }; 我有一个参数包类: 模板 班级
我正在尝试创建一个编译时间矩阵作为模板参数 模板 结构体CTestMatrix { constexpr std::tuple GetData() { 返回 TMA...