gpt4 book ai didi

c++ - 在专门的模板代码中热初始化静态常量成员?

转载 作者:行者123 更新时间:2023-11-30 05:48:46 25 4
gpt4 key购买 nike

我目前无法按照自己的意愿设置类(class)成员。我的模板类仅专门用于合理的整数类型(无符号和“小”)。每个特化都需要一个相当大的仅取决于类型的查找表。所以我认为它绝对应该是静态的(和常量)并且只创建一次。

由于 C++ 没有静态构造函数,我了解到您可以创建一个在初始化时执行繁重工作的类,并将其作为静态成员。

我将我的代码缩减为这些基础:

// Of this, I only want one instance per type,
// because the table can get big.
template<class T>
struct LookUp
{
static int const SIZE = 1 << (sizeof(T) << 3);
std::vector<T> table;

LookUp()
: table{ SIZE }
{
for (int i = 0; i < SIZE; ++i)
{
// Dummy code
table[i] = i;
}
}
};

// "Normal" template class with common code for all types.
template<class T>
class LbpHelper
{
typedef /*...*/ image;
};

// No functionality for the general case.
template<class T>
class Lbp
{
};

// But for this (among others) we have something.
template<>
class Lbp<uint8_t> : public LbpHelper<uint8_t>
{
typedef uint8_t value_type;
typedef Lbp::image image;

static LookUp<value_type> _lookup; // <-- This is the mean one.

public:

// Stuff...
};

初始化静态成员似乎让很多用户感到困惑,尤其是涉及到模板和特化时。我在这里阅读了很多答案,但没有一个能解决我的问题。

我试过类似的东西

// The type of the class is the same as the type of the member class.
template<> LookUp<uint8_t> Lbp<uint8_t>::_lookup{};
template<> LookUp<uint16_t> Lbp<uint16_t>::_lookup{};

header 文件或两者。我尝试使用或不使用 class T在尖括号中(当然在右边使用 T),省略 template<>总而言之,拥有 {}仅在源代码中——我不知道还有什么。没有任何效果。

Visual C++ 要么告诉我 _lookup 不是成员或者它不是可以专门化的实体或者这样:error C2373: '_lookup' : redefinition;不同的类型修饰符

有人可以告诉我把什么放在哪里以便编译吗?

最佳答案

只需删除 template<>位,并将静态数据成员的定义放入 .cpp 文件中:

LookUp<uint8_t> Lbp<uint8_t>::_lookup{};
LookUp<uint16_t> Lbp<uint16_t>::_lookup{};

[Live example]

... 而且,由于 _lookup 的类型是一个类,可以省略{}还有;无论如何都会调用它的默认构造函数。如果您使用的是不支持统一初始化的版本,这可能会让 VC++ 满意。

为什么这是正确的方法:template<>用于引入明确的特化。您没有引入显式特化 - 您正在定义一个已经定义显式特化的数据成员。

这包含在 C++11 14.7.3/5 中:

... Members of an explicitly specialized class template are defined in the same manner as members of normal classes, and not using the template<> syntax. The same is true when defining a member of an explicitly specialized member class. ...

关于c++ - 在专门的模板代码中热初始化静态常量成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28065783/

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