gpt4 book ai didi

c++ - 条件类模板构造函数

转载 作者:行者123 更新时间:2023-11-27 23:38:39 25 4
gpt4 key购买 nike

我正在尝试创建一个具有条件成员的类,如下所示(用于说明问题的示例代码):

template<bool b>
struct conditional_members {};

template<>
struct conditional_members<true>
{ int m; };

template<typename T, bool b>
struct my_class : public conditional_members<b>
{
T n;

// constructor for case when b is false
my_class(T n) : n(n) {};

// constructor for case when b is true
my_class(T n, int m) : n(n), m(m) {};
};

我需要有两个条件构造函数,具体取决于 bool b 但这不会编译。我尝试使用 bool 值专门化构造函数:

template<typename T>
my_class<T, true>::my_class(T n, int m) : n(n), m(m) {};

template<typename T>
my_class<T, false>::my_class(T n) : n(n) {};

但这也不能编译,因为部分函数模板特化是不允许的。

有什么办法可以实现吗?

最佳答案

问题

// constructor for case when b is true
my_class(T n, int m) : n(n), m(m) {};

是构造函数的内存初始化器列表只能命名虚拟基类、直接基类和直接非静态数据成员,而不能命名像m这样的继承成员。这是因为基类的成员由基类子对象的构造函数初始化,所以不能再次初始化(虽然可以赋值)。

您可以改为指定基类初始值设定项。在此示例中,conditional_members 是一个聚合,因此聚合初始化将起作用:

// constructor for case when b is true
my_class(T n, int m) : n(n), conditional_members<b>{m} {};

尽管如此,您可能会因为 my_class 特化始终声明两个构造函数这一事实而产生一些奇怪的副作用,即使实际实例化一个构造函数或另一个构造函数可能无效。

这里有一个 SFINAE 技巧,可以根据 b 使构造函数有条件地有效地不可见:

#include <type_traits>

// Define conditional_members as before.

template<typename T, bool b>
class my_class : public conditional_members<b>
{
T n;

public:
// constructor for case when b is false
template <typename = std::enable_if_t<!b>>
my_class(T n) : n(n) {}

// constructor for case when b is true
template <typename = std::enable_if_t<b>>
my_class(T n, int m) : conditional_members<b>{m}, n(n) {}
};

作为预览,使用 C++20 约束,您将能够以这种更简单的方式编写它:

template<typename T, bool b>
class my_class : public conditional_members<b>
{
T n;

public:
// constructor for case when b is false
my_class(T n) requires(!b) : n(n) {}

// constructor for case when b is true
my_class(T n, int m) requires(b) : conditional_members<b>{m}, n(n) {}
};

关于c++ - 条件类模板构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57279711/

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