gpt4 book ai didi

c++ - 从模板特化中获得对类成员的访问

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:09 24 4
gpt4 key购买 nike

所以,我基本上想向类“添加”额外的东西,这取决于它所使用的模板参数,然后为它取别名以获得更好的界面。像这样:

template<typename T, std::size_t N>
struct basic_foo
{
T data[N];
};

//what you see as comments is what i tried
template<> //template<typename T, std::size_t N>
struct basic_foo<double, 3> //: public basic_foo<T, N>
{
void foo_fun()
{
std::cout << "I'm a foo function!";
for (auto i : data) std::cout << i << " ";
}
};

template<> //template<typename T, std::size_t N>
struct basic_foo<int, 2> //: public basic_foo<T, N>
{
void bar_fun()
{
std::cout << "I'm a bar function!";
for (auto i : data) std::cout << i << " ";
}
};

using foo = basic_foo<double, 3>;
using bar = basic_foo<int, 2>;

int main()
{
foo a = { 12.0, 2.4, 3.0 };
bar b = { 1, 2 };
}

问题是我无法访问特化中的数据

有没有办法做到这一点?还是我应该重新考虑我的结构性决定?

最佳答案

您的代码现在无法编译,因为您的特化中没有 data 成员。您已尝试从主模板继承它,您几乎成功了。

创建一个 basic_foo_base 类(或 struct)模板,在其中存储数据 和不需要特化的函数:

template <typename T, std::size_t N>
struct basic_foo_base
{
T data[N];
};

这只是将 _base 添加到现有定义的名称中。现在,再次定义 basic_foo:

template <typename T, std::size_t N>
struct basic_foo : basic_foo_base<T, N>
{
};

这就是特化的样子:

template <>
// instantiate the base with the same template arguments
struct basic_foo<double, 3> : public basic_foo_base<double, 3>
{
};

我希望我做对了一切。

编辑:不,我没有。

由于继承,basic_foo 将不再是聚合。我们需要添加一些代码,所以初始化:

foo a = { 12.0, 2.4, 3.0 };

再次有效。也就是说,定义一个隐式构造函数采用 std::initializer_list:

basic_foo_base(std::initializer_list<T> const& il)
{
std::copy(il.begin(), il.end(), std::begin(data));
}

并添加

using basic_foo_base::basic_foo_base;
// or, for the primary template:
using basic_foo_base<T, N>::basic_foo_base;

在所有 basic_foo 中将该构造函数包含到重载决策中。

Working code

关于c++ - 从模板特化中获得对类成员的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571188/

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