我正在寻找一种仅在满足模板类型条件时才实例化类的方法。我想在运行时和编译时在类中执行此操作,而不是终止程序,而是抛出异常。
我正在开发一个模板类型需要有时间组件的类。理想情况下,该类型派生自仅将时间定义为成员的类。这样,执行以下操作应该是安全的:
#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/