假设我有以下代码:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
enum open_mode {
read = (1u << 0),
write = (1u << 1),
binary = (1u << 2),
update = (1u << 3)
};
template<int open_type>
class file {
public:
constexpr static int is_read_mode() {
return CHECK_BIT(open_type,0);
}
constexpr static int is_write_mode() {
return CHECK_BIT(open_type,1);
}
constexpr static int is_binary_mode() {
return CHECK_BIT(open_type,2);
}
constexpr static int is_update_mode() {
return CHECK_BIT(open_type,3);
}
template<typename T>
std::enable_if_t<(sizeof(T),is_read_mode()),size_t> read() {}
template<typename T>
std::enable_if_t<(sizeof(T),is_write_mode()),size_t> write() {}
};
我的问题是-是否为open_type的每个不同值实例化一个新的类文件?因为以下代码可以正常编译
int main() {
file<open_mode::write> f;
f.write<int>();
file<open_mode::read> f2;
f2.read<int>();
//f2.write<int>();
}
因为is _ * _ mode()方法是静态的,所以这仅意味着实例化了一个新类,不是吗?
答案 0 :(得分:1)
是的,无论类模板具有哪种模板参数,存在的类数将与给定的不同模板参数列表的总专业化数量一样多。但是,由于这些类的成员是constexpr
函数,并且它们的主体可以编译为单个mov
指令,因此在使用-On(n> 0)进行编译时将不可避免地内联它们。也就是说,无论您拥有file
模板的全部专长,二进制文件都不会增加额外的复杂性。
答案 1 :(得分:0)
为open_type
的其他每种类型的值引入新的类型,例如类,
因此,定义了一个类族的类,它具有该类型的所有静态函数,
如果那是你的意思。
新类文件被实例化
如您所说, 但是
实例化了新的
class file<open_type>
此外,仅提一下,如果我错了,请纠正我, 以便编译该代码,
我们需要从读取或写入中返回一些size_t值 函数,有关使用SFINAE实例化的函数。 我希望这会有所帮助。