c++ - 是否可以在 C++ 中使用非默认构造函数创建模板实例?

标签 c++ templates

从基于模板的类继承时是否可以指定使用哪个构造函数?这似乎是一件基本的事情,但我似乎无法弄清楚如何在 C++ 中完成它...

在以下代码中,我想在创建 PlayerActor(继承自 BaseActor 模板类)时为 PlayerStats 对象使用非默认构造函数。

class BaseStats {
public:
   BaseStats ()
   {

   }

private:
};

class MonsterStats : public BaseStats {
public:
   MonsterStats()
   {

   }

private:
};

class PlayerStats : public BaseStats {
public:
   PlayerStats(
      const bool is_new) : 
         m_is_new(is_new)
   {

   }

private:
   const bool m_is_new;
   PlayerStats(); //Don't want this being used...
};

template <class ActorStatsClass>
class BaseActor
{
public:
   BaseActor()
   {

   }

private:
   ActorStatsClass m_stats;
};

class MonsterActor: public BaseActor<MonsterStats> {
public:
   MonsterActor()
   {

   }
private:
};

// This is where I'm not sure how to tell the template to use a non-default constructor...
// I get an error saying "PlayerStats::PlayerStats": cannot access private member declared in "PlayerStats". (Which is intended, but I don't want it to try and use the default constructor...)
class PlayerActor : public BaseActor<PlayerStats> {
public:
   PlayerActor(const bool is_new)
   {

   }
private:
   PlayerActor(); // Don't use this...
};

最佳答案

template <class ActorStatsClass>
class BaseActor
{
public:
   BaseActor()
   {

   }

private:
   ActorStatsClass m_stats;
};

如果此 BaseActor 类将具有任意成员,则它需要构造那些任意成员的方法。所以它需要一个通用的构造函数。

template <class ActorStatsClass>
class BaseActor
{
public:
   template<class...Us>
   BaseActor(Us&&...vs)
   : m_stats(std::forward<Us>(vs)...)
   { }

private:
   ActorStatsClass m_stats;
};

这使用了转发,无论传递给 BaseActor 的参数是什么,它都只是将它们直接传递给构造 m_stats 成员。

这允许:

class PlayerActor : public BaseActor<PlayerStats> {
public:
   PlayerActor(const bool is_new)
   : BaseActor<PlayerStats>(is_new)
   { }
   PlayerActor() = delete; // Note: this is better than making it private
};

关于c++ - 是否可以在 C++ 中使用非默认构造函数创建模板实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560789/

相关文章:

c++ - 验证输入

c++ - 为什么模板只能在头文件中实现?

templates - PyCharm中自动填充文件 "creation"日期

c++ - 基于 L 或 R 值模板的成员变量类型

c++ - SDL2 键盘检测不起作用

c++ - 为什么模板函数的Template在Visual C++中无效

c++ - SQLite 能胜任这项任务吗?存储路径名和文件属性

c++ - 通过引用将整数类型的变量传递给函数会比通过值更有效吗?

c++ - 有什么工具可以帮助我阅读 c++ 模板编译错误吗?

c++ - 有没有办法检测混合类型和非类型的任意模板类?