我正在开发一个具有模板功能的项目,如下所示:
template <class T>
T foo<T>(T val) { return someFunc(val); }
template <>
bool foo<bool>(bool val) { return otherFunc(val); };
现在,我有课Bar
,我不想接受它作为输入。事实上,我希望它生成一个易于发现的编译错误。问题是如果我这样做:
template <>
Bar foo<Bar>(Bar val) { static_assert(false,"uh oh..."); }
每次编译都会失败。我发现https://stackoverflow.com/a/3926854/7673414 https://stackoverflow.com/a/3926854/7673414,这表示我需要引用模板类型,否则总是会发生静态断言。问题是我这里没有模板类型。如果我做:
template< typename T >
struct always_false {
enum { value = false };
};
template <>
Bar foo<Bar>(Bar val) { static_assert(always_false<Bar>::value,"uh oh..."); }
那么它也总是编译失败。有没有办法确保模板的实例化具有类型Bar
总是导致编译错误?
Since foo
是一个完整的专业化,它总是会被编译,并且静态断言总是会被调用。
然而,有一个更简单的方法 http://en.cppreference.com/w/cpp/language/function#Deleted_functions:
template <>
Bar foo<Bar>(Bar val) = delete;
这会说这个特定版本已被删除,并且无法调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)