gpt4 book ai didi

c++ - 启用 if/else 类成员模板实例化

转载 作者:行者123 更新时间:2023-11-28 05:39:36 25 4
gpt4 key购买 nike

谁能告诉我如何根据来自预定义基集的不同派生类启用 if/else 类成员模板?让我使用以下示例:

enum class Type {
TYPEA,
TYPEB
};

// Predefined in libraries.
class BaseA {...};
class BaseB {...};

class Foo {
template <typename Derived, Type type>
void foo();
};

// User-derived
class DerivedA : public BaseA {};
class DerivedB : public BaseB {};

通常我们需要两个模板类型名来调用成员 foo。

Foo obj;
obj.foo<DerivedA, Type::TypeA>()
obj.foo<DerivedB, Type::TypeB>();

但是,这种 native 方法似乎很冗长,因为第二个模板参数 Type::TypeAType::TypeB显然可以由编译器通过第一个参数推导出来 DerivedADerivedB ,如果它们正确地派生自预定义的基础。我注意到 c++11 提供了 is_base_of模板,但我不确定如何在我的案例中使用它。更具体地说,以下是预期的解决方案:

obj.foo<DerivedA>();  // Automatically deduce type = Type::TypeA
obj.foo<DerivedB>(); // Automatically deduce type = Type::TypeB

如果编译无法推断出 Type从第一个类型名开始,它应该回到正常声明 obj.foo<MyClass, MyType>其中 MyTypeType::TypeAType::TypeB .

最佳答案

听起来你只是想要一个默认的模板参数:

class Foo {
template <typename Derived, Type type = get_type_from<Derived>::value>
void foo();
};

在哪里get_type_from<>是一个元函数,稍后根据您实际计算 Type 的方式填写。秒。

关于c++ - 启用 if/else 类成员模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com