1

好的,这是我第一次涉足模板,这可能是几个非常愚蠢、简单的问题中的第一个。

考虑:

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()),我想在他的脸上抛出一个编译错误。

这是可行的吗?如果是这样,怎么做?

这是一个合理的方法吗?

4

1 回答 1

3

保持未定义:

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
}
于 2012-12-12T23:33:49.950 回答