我有一个不能直接使用的类模板,只允许专业化。我想用static_assert
显示有意义的错误消息。
我不能只打字static_assert(false, "error");
since false
不依赖于值,即使从未使用过模板,编译器也可能会显示错误消息。
我的解决方案:
template<class>
struct AlwaysFalse : std::false_type{};
#define DEPENDENT_FALSE(arg) AlwaysFalse<decltype(sizeof(arg))>::value
template<class T>
struct Foo{
static_assert(DEPENDENT_FALSE(T), "You must use specialization!");
};
template<int i>
struct Bar{
static_assert(DEPENDENT_FALSE(i), "You must use specialization!");
};
但我不确定实现DEPENDENT_FALSE
。因为MSVCdoesn't http://rextester.com/OCOBN40973 treat sizeof(arg)
作为模板相关表达式(与海湾合作委员会不同 http://rextester.com/TEBIO81232), but decltype(sizeof(arg))
is fine http://rextester.com/OGJFG98733.
有人可以用标准来解释这种行为吗?它是便携式的吗?
This:
#define DEPENDENT_FALSE(arg) AlwaysFalse<decltype(sizeof(arg))>::value
实际上并非如此依赖的. decltype(sizeof(arg))
总是size_t
,它实际上并不取决于arg
无论如何(更广泛地说,这是一个表达式列表 http://eel.is/c++draft/temp.dep#expr-4永远不依赖于类型)。由于它不依赖,编译器完全能够看到DEPENDENT_FALSE(T)
is false
然后触发它static_assert
.
你想要的只是:
#define DEPENDENT_FALSE(arg) AlwaysFalse<decltype(arg)>::value
也就是说,删除sizeof
。现在这个is依赖。
这不适用于int
直接,因为这又不会依赖(decltype(i)
只是int
,我们现在需要一些依赖于值的东西)。为此,您可以将其包装在一个整数常量中:
template<class T>
struct Foo{
static_assert(AlwaysFalse<T>::value, "You must use specialization!");
};
template<int i>
struct Bar{
static_assert(AlwaysFalse<std::integral_constant<int, i>>::value, "You must use specialization!");
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)