【发布时间】:2012-01-08 11:24:11
【问题描述】:
有没有更好的方法来执行以下操作?
#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) 不能永远为零。
总之,我想知道是否:
- 还有另一种方法可以做到这一点。
- 我弄错了,
BOOST_STATIC_ASSERT(sizeof(T))实际上不能在没有实例化的情况下失败。 - 唯一的方法是让它成为上面的链接器错误。
【问题讨论】:
-
BOOST_STATIC_ASSERT(false);更直接地说出你想要什么。
标签: c++ templates boost template-specialization