有更好的方法来执行以下操作吗?
#include <iostream>
template <typename T>
T Bar();
template <>
int Bar<int>() { return 3; }
// Potentially other specialisations
int main()
{
std::cout << Bar<int>() << std::endl; // This should work
std::cout << Bar<float>() << std::endl; // This should fail
}
该解决方案的问题在于,它在(可以理解的)链接时失败,并出现“未定义的浮点数引用”Bar<float>()
”或类似的内容。这可能会让其他开发人员感到困惑,因为他们可能怀疑未链接实现文件。
我确实知道另一个潜在的解决方案:
template <typename T>
T Bar() { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
这会导致编译器错误Bar<float>()
所要求的,正是我想要的。但是,我担心从技术上讲编译器可能会拒绝这一点,就像 gcc 拒绝一样BOOST_STATIC_ASSERT(false)
因为它知道无论模板参数如何它都会失败,因为sizeof(T)
can never为零。
总而言之,我想知道是否:
- 还有另一种方法可以做到这一点。
- 我错了并且
BOOST_STATIC_ASSERT(sizeof(T))
实际上如果没有实例化就不会失败。
- 唯一的方法是让它成为链接器错误,如上所述。
这可以工作:
template <typename T>
T Bar() {
T::ERROR_invalid_template_argument_;
}
template <>
int Bar<int>() { return 3; }
如果您害怕使用 0,您也可以使用尽可能大的大小:
static_assert(sizeof(T) == -1, "No specialization");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)