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

假设我有 3 个类如图所示

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

谢谢。

【问题讨论】:

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

标签: c++ class templates


【解决方案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{};
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 2018-12-28
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多