gpt4 book ai didi

c++ - 具有两个整数参数的类的部分特化

转载 作者:行者123 更新时间:2023-11-28 06:19:41 25 4
gpt4 key购买 nike

所以我有一个看起来像这样的类:

template <unsigned short MODE, unsigned int N = 128>
class AESLocker {
public:

//Default Constructor
AESLocker() : ENCRYPTION_KEY_LENGTH(N) {
//Blah blah
}

//Contructor
AESLocker(std::string key, std::string ivec);

我正在尝试根据带有 #defines 的文件中提到的 MODE 实现不同的功能。

但是,我未能为 2 种模式创建两个不同的构造函数。即我想部分专门化构造函数。

  //constructor
template<unsigned short MODE, unsigned int N>
AESLocker<MODE, N>::AESLocker(std::string key, std::string ivec) {
//blah
}

上面的模板目前用于所有模式和所有 N。我想要的是专用于模式而不是 N。即我想要一个用于模式 1 的所有 N 的构造函数和一个用于模式 2 的所有 N 的构造函数。

在过去的 30 分钟里,我尝试了各种各样的事情。我该怎么做?

最佳答案

构造函数是特殊函数,但它们仍然是函数。该语言不允许模板函数的部分特化,因此您不能部分特化构造函数。

如果不同版本之间的变化发生在主体(而不是初始化列表)中,那么您可以将该逻辑移至不同的私有(private)函数并使用其他机制调用它。标签调度浮现在脑海中:

  // Make these private
template <unsigned short MODE, unsigned int N>
void AESLocker<MODE, N>::init(std::string key, std::string ivec, Int2Type<1>) {
// Specialization for MODE == 1
}
template <unsigned short MODE, unsigned int N>
template <int X>
void AESLocker<MODE, N>::init(std::string key, std::string ivec, Int2Type<X>) {
// Generic for all other modes
}
// Dispatch based on MODE
template<unsigned short MODE, unsigned int N>
AESLocker<MODE, N>::AESLocker(std::string key, std::string ivec) {
init(std::move(key), std::move(N), Int2Type<MODE>());
}

请注意,我使用了通用的 Int2Type , 强制使用模板化 init对于一般情况,但如果您只想区分 1其余的,您可以使用只有两个选项的标签类型,01并发送:

Int2Type<MODE == 1>()

在这种情况下,init 的两个重载将是非模板的。请注意,除了语法开销外没有实际区别,因为函数是按需生成的,这意味着只有一个 init将根据 AESLocker 的特化生成.


正如 Jarod42 提到的,在 C++11 及更高版本中,您还可以使用转发构造函数来执行相同的操作:

// private constructors
template <unsigned short MODE, unsigned int N>
AESLocker<MODE, N>::AESLocker(std::string & key, std::string & ivec, Int2Type<0>)
: // initializer list
{ // constructor body
}
// public constructor
template <unsigned short MODE, unsigned int N>
AESLocker<MODE, N>::AESLocker(std::string key, std::string ivec)
: AESLocker(std::move(key), std::move(ivec), IntToType<MODE>())
{}

我省略了其中一个重载。作为正交更改,我已将参数类型修改为对字符串的引用(无需继续移动 keyivec 对象,我们知道调用者,我们可以随意处理字符串)。

关于c++ - 具有两个整数参数的类的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29532085/

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