为非专用模板实例化强制执行编译错误



好吧,这是我第一次尝试使用模板,这可能是几个非常愚蠢、简单的问题中的第一个。

考虑:

template <class T>
void sendit(char *buffer, unsigned len)
{
// force compile error
}
void sendit<first_valid>(char *buffer, unsigned len)
{
// this is OK
}

void sendit<second_valid>(char *buffer, unsigned len)
{
// this is OK
}

基本上,我的想法是,我有一组可以通过sendit()过程合法操作的"东西",我将专门化这些东西的模板。如果一个用户试图调用sendit(),(好吧,从技术上讲,是sendit()),我想在他的脸上抛出一个编译错误。

这行吗?如果是,如何?

这种做法合理吗?

未定义:

template <class T>
void sendit(char *buffer, unsigned len);
// C++11
template <class T>
void sendit(char *buffer, unsigned len) = delete;

使用= delete是IMO.的首选方法

或者,做一些类型的静态断言(在C++03中使用Boost):

template <class T>
void sendit(char *buffer, unsigned len) {
static_assert(sizeof(T) == 0, "must specialize"); // must use sizeof to make it dependant on T
}

不管怎样,你确定你真的需要在这里键入模板吗?我并不是说你不应该,只是要注意有一些涉及过载的替代方案,比如:

// This is only if you're using the types as tags
// Don't do this otherwise!!!
void sendit(first_valid, char *buffer, unsigned len)
{
// this is OK
}

void sendit(second_valid, char *buffer, unsigned len)
{
// this is OK
}
sendit(first_valid(), ...); // call first
sendit(second_valid(), ...); // call second

或者使用枚举而不是类型作为模板参数:

enum foo { first, second }
template <foo Foo>
void sendit(char *buffer, unsigned len);
void sendit<first>(char *buffer, unsigned len)
{
// this is OK
}

最新更新