在 C++ 中的多个类中使用模板类

Posted

技术标签:

【中文标题】在 C++ 中的多个类中使用模板类【英文标题】:Using a template class in multiple classes in C++ 【发布时间】:2020-04-14 10:42:58 【问题描述】:

假设我有 3 个类如图所示

我想创建一个模板函数,而不是对象类中的函数,它可以代替对象类中的两个函数。我遇到的问题是我不知道如何允许模板函数接受类型修饰符_1 或类型修饰符_2 的参数。有没有办法做到这一点?

谢谢。

【问题讨论】:

请不要将代码包含为图像。将代码包含为文本。最好尝试一些东西并展示你的尝试。目前尚不清楚为什么您在编写接受两者之一的方法模板时遇到问题。如果您的问题是该方法不仅接受这两个,而且还接受其他任何内容,我可以理解,但目前尚不清楚是什么问题 顺便说一句,您的两种方法都不使用mod_1 / mod_2,它们只是添加了两个ints,您可以删除未使用的参数并且您的“问题”消失了 @idclev463035818 ...除非这是一个简化和提炼的示例,而在实际代码中实际使用了参数。 @lisyarus 在这种情况下,它被提炼到本质已经消失并且像 mcve 一样无用的范围内。在发布的代码中,无法知道为什么删除未使用的参数不是解决方案 【参考方案1】:

我能想到 3 种解决方案,可能会满足您的需求。

1.

class object : public modifier_1, public modifier_2

private:
   int x;
   template<class Modifier>
   void modify_by_modifier_helper(Modifier mod, int modifier)
   
      x += modifier;
   
public:
   object() = default;
   void modify_by_modifier(modifier_1 mod, int modifier)
   
      modify_by_modifier_helper(mod, modifier);
   

   void modify_by_modifier(modifier_2 mod, int modifier)
   
      modify_by_modifier_helper(mod, modifier);
   
;

2.

#include <type_traits>

class object : public modifier_1, public modifier_2

private:
   int x;
public:
   object() = default;

   template<class Modifier>
   void modify_by_modifier(Modifier mod, int modifier)
   
      static_assert(std::is_same_v<std::decay_t<Modifier>, modifier_1> ||
         std::is_same_v<std::decay_t<Modifier>, modifier_2>,
         "Modifier must be modifier_1 or modifier_2")

      x += modifier;
   
;

3.

#include <type_traits>

class object : public modifier_1, public modifier_2

private:
   int x;
public:
   object() = default;

   template<class Modifier>
   std::enable_if_t<std::is_same_v<std::decay_t<Modifier>, modifier_1> ||
         std::is_same_v<std::decay_t<Modifier>, modifier_2>, void>
   modify_by_modifier(Modifier mod, int modifier)
   
      x += modifier;
   
;

【讨论】:

第一个解决方案是否使对象类抽象?我现在无法实例化它。 @CosmicCoder123 不,它不应该使它抽象。我用 g++ 和 clang++ 对其进行了测试,并且我希望能够实例化它。 @Issac Clancy 我认为该方法是我想要的,但由于某种原因,它使我的对象类在 Visual Studio 2019 中进行抽象编译。所以我无法实例化对象。 @CosmicCoder123 我在 Visual Studio 2019 中对其进行了测试,它工作正常。尝试将 object() = default; 更改为 object() 并查看 Visual Studio 给出的错误。 @CosmicCoder123 如果你正在像这样实例化你的对象object o();尝试像这样实例化你的对象object o;

以上是关于在 C++ 中的多个类中使用模板类的主要内容,如果未能解决你的问题,请参考以下文章

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

C++模板类中的成员函数以及模板函数在类外定义的方式

C++学习34 模板类

c++在模板类中使用list问题

模板类中的 c++ 赋值运算符实现

Item 43:访问模板基类中的名称 Effective C++笔记