gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:34 26 4
gpt4 key购买 nike

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

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

#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/

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