将为非类型模板参数的不同值实例化新类

时间:2018-07-11 16:57:53

标签: c++ templates template-meta-programming sfinae

假设我有以下代码:

#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()方法是静态的,所以这仅意味着实例化了一个新类,不是吗?

2 个答案:

答案 0 :(得分:1)

是的,无论类模板具有哪种模板参数,存在的类数将与给定的不同模板参数列表的总专业化数量一样多。但是,由于这些类的成员是constexpr函数,并且它们的主体可以编译为单个mov指令,因此在使用-On(n> 0)进行编译时将不可避免地内联它们。也就是说,无论您拥有file模板的全部专长,二进制文件都不会增加额外的复杂性。

答案 1 :(得分:0)

open_type的其他每种类型的值引入新的类型,例如类, 因此,定义了一个类族的类,它具有该类型的所有静态函数, 如果那是你的意思。

  

新类文件被实例化

如您所说, 但是

  

实例化了新的class file<open_type>

此外,仅提一下,如果我错了,请纠正我, 以便编译该代码,

我们需要从读取或写入中返回一些size_t值 函数,有关使用SFINAE实例化的函数。 我希望这会有所帮助。