gpt4 book ai didi

c++ - 构造函数、模板和非类型参数

转载 作者:IT老高 更新时间:2023-10-28 22:15:03 25 4
gpt4 key购买 nike

由于某些原因,我有一个类必须依赖于 int模板参数。
出于同样的原因,该参数不能是类的参数列表的一部分,而是其构造函数的参数列表的一部分(当然是模板化的)。

问题出现了。
也许我遗漏了一些东西,但我看不到向构造函数提供这样一个参数的简单方法,因为它不能被推导或显式指定。

到目前为止,我找到了以下替代方案:

  • 将上述参数放入类的参数列表中

  • 创建一个可以调用的工厂方法或工厂函数,例如factory<42>(params)

  • 为构造函数提供一个traits结构

我尝试为最后提到的解决方案创建一个(不是那么)最小的工作示例,也是为了更好地解释问题。
示例中的类本身并不是模板类,关键是构造函数,反正真正的就是模板类。

#include<iostream>
#include<array>

template<int N>
struct traits {
static constexpr int size = N;
};

class C final {
struct B {
virtual ~B() = default;
virtual void foo() = 0;
};

template<int N>
struct D: public B{
void foo() {
using namespace std;
cout << N << endl;
}

std::array<int, N> arr;
};

public:
template<typename T>
explicit C(T) {
b = new D<T::size>{};
}

~C() { delete b; }

void foo() { b->foo(); }

private:
B *b;
};

int main() {
C c{traits<3>{}};
c.foo();
}

说实话,上面提到的解决方案都不适合:

  • 将参数移动到类的参数列表中完全破坏了它的设计,不是一个可行的解决方案

  • 我想避免使用工厂方法,但它可以解决问题

  • traits struct 似乎是迄今为止最好的解决方案,但不知何故我并不完全满意

这个问题很简单:是否有什么我错过了,也许是一个更简单、更优雅的解决方案,一个我完全忘记的语言细节,或者上面提到的三种方法是我必须选择的?< br/>任何建议将不胜感激。

最佳答案

你必须传入一些可以推断的东西。最简单的使用方法是一个空的 int 包装器:std::integral_constant .由于您只想要 int 我相信,我们可以给它取别名,然后只接受该特定类型:

template <int N>
using int_ = std::integral_constant<int, N>;

您的 C 构造函数只接受:

 template <int N>
explicit C(int_<N> ) {
b = new D<N>{};
}

C c{int_<3>{}};

您甚至可以全力以赴并为此创建一个用户定义的文字(a la Boost.Hana),以便您可以编写:

auto c = 3_c; // does the above

另外,考虑简单地将特征转发到 D。如果到处都是类型,元编程会更好。也就是说,在C中仍然接受相同的int_:

template <class T>
explicit C(T ) {
b = new D<T>{};
}

现在 D 期望具有 ::value:

的东西
template <class T>
struct D: public B{
static constexpr int N = T::value;

void foo() {
using namespace std;
cout << N << endl;
}

std::array<int, N> arr;
};

C 的用户的角度来看,这两种方式都是一样的,但值得思考。

关于c++ - 构造函数、模板和非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517095/

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