我们有复杂的模板类,其中一些方法不适用于某些策略或类型。因此,当我们检测到这些类型时(在编译时,使用 type-traits),我们会触发一个带有不错消息的静态断言。
现在我们也做了很多手动模板实例化。部分原因是方法被迫编译器对方法进行语法检查。它还减少了库用户的编译时间。问题是静态断言总是被触发,因此我们不能手动实例化有问题的模板类。
有解决方法吗?
编辑:为了更清楚,这是一个例子(在这种情况下,显式实例化将在 someFunc1() 上失败:
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2:这是另一个例子。这一次你可以编译它,看看我的意思。首先立即编译。代码应该编译。然后取消注释 [2]并且应该触发静态断言。现在注释掉 [2]并取消注释 [1]。静态断言将触发,因为您正在显式实例化模板。我想避免删除显式实例化,因为它带来了好处(参见上面的好处)。
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template <typename T>
class foo
{
public:
void func() {}
void func1() { LOKI_STATIC_CHECK(sizeof(T) == 4, Assertion_error); }
};
template foo<int>;
//template foo<double>; // [1]
int main()
{
foo<int> a;
a.func1();
foo<double> b;
//b.func1(); //[2]
return 0;
}