阻止非专业模板c ++

时间:2011-08-04 19:59:04

标签: c++ templates specialization

是否有可能以某种方式禁止对未明确写入特化的类型使用模板化函数。我的意思是那样的

template <typename T>
void foo(){}

template <>
void foo<int>(){}

int main(int argc, char* argv[]){
    foo<int>(); //ok
    foo<char>(); //Wrong - no specialized version for char.
}

我不能跳过通用版本的函数,因为编译器说,当我尝试专门化时,foo不是模板函数。我可以简单地编写一些不能在泛型函数中编译的东西,并添加一些解释原因的注释,但这将是非常无用的信息。我想做的是,能够直接导致编译器出现错误,例如“foo()未定义”。

2 个答案:

答案 0 :(得分:13)

当然:只是不定义它,如果你试图使用它会得到链接器错误:

template <typename T>
void foo(); // not defined

template <>
void foo<int>() { }

或者,您可以使用静态断言的某些变体来提供“更好”的编译时错误。以下是使用C ++ 0x static_assert的示例。请注意,您必须使false值取决于模板参数,否则在解析模板时可能会触发static_assert

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

template <typename T>
void foo()
{
    static_assert(dependent_false<T>::value, "Oops, you used the primary template");
}

请注意,它通常最好not to specialize function templates。相反,最好委托给专门的类模板:

template <typename T>
struct foo_impl
{
    static_assert(dependent_false<T>::value, "Oops, you used the primary template");
};

template<>
struct foo_impl<int>
{
    static void foo() { }
};

template <typename T>
void foo()
{
    return foo_impl<T>::foo();
}

答案 1 :(得分:4)

当然,只是不提供默认通用模板的定义。