Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;代码风格:SHA2算法 我在犹豫如何在C++中组织实现Saa2算法。_C++_Templates_Coding Style - Fatal编程技术网

C++;代码风格:SHA2算法 我在犹豫如何在C++中组织实现Saa2算法。

C++;代码风格:SHA2算法 我在犹豫如何在C++中组织实现Saa2算法。,c++,templates,coding-style,C++,Templates,Coding Style,我之所以犹豫不决,是因为SHA2可以用4种方式实现,它们将产生4种不同的摘要大小(224、256、384和512位) 我正在考虑一个模板类,专门用于可以使用SHA2生成的摘要大小。然后问题是为非专业类编写什么。我能想到一些可能性: //1 : throw exception on instantiation. template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{ public: S

我之所以犹豫不决,是因为SHA2可以用4种方式实现,它们将产生4种不同的摘要大小(224、256、384和512位)

我正在考虑一个模板类,专门用于可以使用SHA2生成的摘要大小。然后问题是为非专业类编写什么。我能想到一些可能性:

//1 : throw exception on instantiation.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    SHA2(){
        throw SHA2NotImplementedException(bits);
    }
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}

//2 : throw exception on use.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const{return SHA2NotImplementedException(bits);}
}

//3 : forbid instantiation and inheritance.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

private:
    SHA2(){}

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}

//4 : forbid instantiation.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}


//5 : dummy return.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const{return Bits();}
}


//Write template specialization for bits = 224, 256, 384 and 512
//1:实例化时引发异常。
模板类SHA2:公共哈希算法{
公众:
SHA2(){
抛出SHA2NotImplementedException(位);
}
虚拟~SHA2()抛出(){}
虚拟位哈希(常量位和数据)常量=0;
}
//2:使用时引发异常。
模板类SHA2:公共哈希算法{
公众:
虚拟~SHA2()抛出(){}
虚拟位哈希(常量位和数据)常量{return SHA2NotImplementedException(Bits);}
}
//3:禁止实例化和继承。
模板类SHA2:公共哈希算法{
私人:
SHA2(){}
公众:
虚拟~SHA2()抛出(){}
虚拟位哈希(常量位和数据)常量=0;
}
//4:禁止实例化。
模板类SHA2:公共哈希算法{
公众:
虚拟~SHA2()抛出(){}
虚拟位哈希(常量位和数据)常量=0;
}
//5:虚拟返回。
模板类SHA2:公共哈希算法{
公众:
虚拟~SHA2()抛出(){}
虚拟位哈希(常量位和数据)常量{return Bits();}
}
//位=224、256、384和512的写入模板专门化
那么,你会写什么?哪个选项比其他选项更清晰?为什么


PS:我也可以只编写4个独立的算法,而不需要修改代码样式。

只需将其完全保留为空(没有声明成员函数或变量)…为什么不呢?如果不使用非专用类,这是标准技术


模板实例化不必具有相同的接口:它们基本上是完全独立的类

只需将其完全保留为空(没有声明成员函数或变量)…为什么不呢?如果不使用非专用类,这是标准技术


模板实例化不必具有相同的接口:它们基本上是完全独立的类

如果使用模板参数,则该值必须在编译时可用。如果没有可能的实现,等待运行时标记错误似乎很愚蠢


因此,保留未指定的非专用模板,让它产生编译时错误。

如果使用模板参数,则该值必须在编译时可用。如果没有可能的实现,等待运行时标记错误似乎很愚蠢

因此,保留未指定的非专用模板,让它产生编译时错误