gpt4 book ai didi

c++ - 为什么模板类型参数不可见/不存在而不是非类型参数?

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:57 26 4
gpt4 key购买 nike

在一个包含另一个模板类的模板类中(重要的是,一个可交换的存储表示......无论如何),我认为与其传递几个模板参数down,不如传递内部模板的一个实例并再次到达参数 up 会更优雅。

为什么不呢!当然可以,而且更优雅!

现在,也许上面的内容有点难以理解,所以让我们看看我一直在尝试做的一些(几乎可编译的)代码:

template<typename T, int n> struct foo
{
// using alias_of_T = T;
};

template<typename FOO> struct bar
{
FOO _foo;

// this works just fine!?
static constexpr int size = FOO::n;

// this indeed works, but... bleh
// using type_t = typename FOO::alias_of_T;

// this does not work?
using type_t = typename FOO::T;

type_t whatever() { return ...; }
};

//...

int main()
{
bar<foo<int, 3>> zoo;
...

令人惊讶的是,FOO 的模板参数T 是不可访问的。但更令人惊讶的是,完全有可能访问 n

这背后的原理是什么?

有没有比使用 FOO::alias_of_T 更优雅的方法?

Re: 为什么它对非类型参数有效?

原来我太笨了,看不懂自己的代码!有(@Barry 的荣誉)确实是一个“不同的大小”,即 constexpr size = n 原始代码中的别名(未修剪,not-foo-bar)代码,我似乎有完全被忽视了。这就解释了为什么它对非类型参数“工作正常”,这并不奇怪。嗯,这很尴尬,你真的必须能够正确阅读你自己输入的代码......

最佳答案

The surprise is that FOO's template parameter T is not accessible. But even more surprising, it is perfectly possible to access n.

我想这取决于您对完美的定义。实际上不可能访问 n,但是您发现它的时间点有点不同。实际上,如果您尝试使用 size:

#include <iostream>

template <typename T, int n>
struct foo { };

template <typename FOO>
struct bar {
static constexpr int size = FOO::n;
};

int main() {
bar<foo<int, 3>> zoo;
std::cout << zoo.size << '\n'; // error: n is not a member of foo<int, 3>
}

这是因为 [temp.inst]/3 :

[...] in particular, the initialization (and any associated side effects) of a static data member does not occur unless the static data member is itself used in a way that requires the definition of the static data member to exist.

在您的示例中,没有任何东西要求静态数据成员存在,因此它的初始化还没有发生——而且这种初始化可能是格式错误的。

如果您直接尝试访问名称“n”,您会看到相同的内容:

template <typename T, int n>
struct foo { };

template <typename FOO>
struct bar {
int array[FOO::n]; // error
};

int main() {
bar<foo<int, 3>> zoo;
}

关于c++ - 为什么模板类型参数不可见/不存在而不是非类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48009242/

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