C++ 仅在满足模板类型的条件时才创建类的实例

标签 c++ templates inheritance exception

我正在寻找一种仅在满足模板类型条件时才实例化类的方法。我想在运行时和编译时在类中执行此操作,而不是终止程序,而是抛出异常。

我正在开发一个模板类型需要有时间组件的类。理想情况下,该类型派生自仅将时间定义为成员的类。这样,执行以下操作应该是安全的:

#include <type_traits>
#include <stdexcept>

class Time
{
  public:
    double t;
};

class A : Time
{

};

template<class T>
class B
{
    T data;

    void do_someting()
    {
      data.t = 12.34;
    }
};

B<A> some_instance;

我找到了这个 C++ templates that accept only certain types

所以下面会做检查,但 static_assert 只在编译时检查。

template<class T>
class B
{
    static_assert(std::is_base_of<Time, T>::value, "T must inherit from Time Class");
    T data;

    void do_someting()
    {
      data.t = 12.34;
    }
};

执行以下操作是否安全,或者是否有更简洁的归档方式?

编辑:由于 Timos 输入而更改。

template<class T>
class B
{
  B()
  {
    if(std::is_base_of<Time, T>::value)
    {
      throw std::invalid_argument( "T must inherit from Time Class" );
    }
  }

    T data;

    void do_someting()
    {
      data.t = 12.34;
    }
};

最佳答案

我对您要实现的目标感到有点困惑。据我了解,您希望防止 B 与不继承自 Time 的类一起使用。

为此,带有static_assert 的解决方案是最好的解决方案。 C++ 的优势之一是在违反前提条件时可能导致编译错误。在 Javascript、PHP、Bash 等弱类型语言中,这会导致运行时错误,这需要您为该段代码创建一个测试用例。

有异常(exception)的其他解决方案不会增加任何好处,因为 if 语句 将在编译时进行评估,并且实际上是 if (true)如果(假)

因此,通过编写第二个解决方案,您实际上需要更多时间来调试代码,因为您必须启动可执行文件、运行使用此代码的测试用例并使用调试器检查行为。所有这些都可以通过 static_assert 来阻止。

关于C++ 仅在满足模板类型的条件时才创建类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664684/

相关文章:

c++ - 随机数生成器不断创建 2

c++ - 错误 : expected identifier before 'template'

c++ - 使用类模板而不传递模板参数

c# - 为什么当对象是子类类型时,不能从父类(super class)中调用子类中的公共(public)方法?

entity-framework - 我应该如何映射多个继承模型之间的关系?

c++ - 埃拉托色尼筛法 - 质因数

c++ - 在 C++ 中,系统如何将这些对象中的每一个与程序执行的窗口相关联?

python - 简化在Pybind11中为C++模板类生成包装器类的步骤:模板声明不能出现在 block 作用域中

c++ - 如何专门化从特定类型派生的类型的模板

Java - 扩展子类中的私有(private)方法