通过模板专业化获得对类成员的访问权限
Gaining access to class members from template specialization
所以,我基本上想在类中"添加"额外的东西,这取决于它与什么模板参数一起使用,然后对它进行别名以获得更好的界面。类似这样的东西:
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
。
有办法做到这一点吗?还是我应该重新思考我的结构性决策?
您的代码现在不编译,因为您的专业中没有data
成员。你试图从主模板继承它,但你几乎得到了它
制作一个basic_foo_base
类(或struct
)模板,在其中存储data
和不需要专门化的函数:
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;
在所有CCD_ 10s中将该构造函数包括在过载解析中。
工作代码
除了包含data
的公共基类之外,您还可以完全专门化:
template<>
struct basic_foo<double, 3>
{
double data[3]; // Should be here.
void foo_fun()
{
std::cout << "I'm a foo function!";
for (auto i : data) std::cout << i << " ";
}
};
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间