在模板函数的特定实例化上使C++失败编译

bla*_*ost 7 c++ templates template-specialization c++11

我正在开发一个具有模板功能的项目:

template <class T> 
T foo<T>(T val) { return someFunc(val); }

template <>
bool foo<bool>(bool val) { return otherFunc(val); };
Run Code Online (Sandbox Code Playgroud)

现在,我有一个课程Bar,我不想接受它作为输入.实际上,我希望它能够生成一个容易发现的编译错误.问题是,如果我这样做:

template <>
Bar foo<Bar>(Bar val) { static_assert(false,"uh oh..."); }
Run Code Online (Sandbox Code Playgroud)

它在每次编译时都失败了.我找到了/sf/answers/274879811/,它说我需要引用模板类型,否则静态断言总会发生.问题是我这里没有模板类型.如果我做:

template< typename T >
struct always_false { 
    enum { value = false };  
};

template <>
Bar foo<Bar>(Bar val) { static_assert(always_false<Bar>::value,"uh oh..."); }
Run Code Online (Sandbox Code Playgroud)

那么它也总是无法编译.有没有办法确保带有类型的模板实例化Bar总是会导致编译错误?

Dan*_*l H 20

由于foo是一个完整的专业化,它将始终被编译,并且静态断言将始终被调用.

但是,有一种更简单的方法:

template <>
Bar foo<Bar>(Bar val) = delete;
Run Code Online (Sandbox Code Playgroud)

这将说明此特定版本已删除,无法调用.