gpt4 book ai didi

c++ - 为未专门化的模板实例化强制编译错误

转载 作者:行者123 更新时间:2023-11-28 00:51:31 24 4
gpt4 key购买 nike

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

考虑:

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
}

关于c++ - 为未专门化的模板实例化强制编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13850465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com