我如何在c++中使用可变模板,同时保持我的实现类私有
How can I use variadic template in C++ while keeping my implementor class private?
#include <cstdio>
class builtin_pack
{
long v[4];
public:
builtin_pack ( long v1, long v2, long v3, long v4 ) : v{v1, v2, v3, v4} {}
void builtin_op()
{
printf ( "%lx,%lx,%lx,%lxn", v[0], v[1], v[2], v[3] );
};
template<typename Func, typename... Targs>
void builtin_apply ( Func f, Targs ... t )
{
for ( int i = 0; i < 4; i++ )
{
v[i] = f ( t.v[i]... );
}
}
};
class pack : builtin_pack
{
public:
pack ( long v1, long v2, long v3, long v4 ) : builtin_pack ( v1, v2, v3, v4 ) {}
template<typename Func, typename... Targs>
pack& apply ( Func f, Targs ... t )
{
this->builtin_apply ( f, t... );
return *this;
}
void op()
{
this->builtin_op();
}
};
int main()
{
pack p1{0xff, 0x0f, 0xf0, 0x06}, p2{0x0f00, 0xf000, 0x6700, 0xff00};
pack p3{0x12340000, 0x56780000, 0x45120000, 0xdead0000};
p3.apply ( [] ( long i, long j, long k )->long{return i | j | k;}, p1, p2, p3 );
p3.op();
return 0;
}
代码编译错误:
main.cpp:17:24: error: cannot cast 'pack' to its private base class 'builtin_pack'
v[i] = f ( t.v[i]... );
^
main.cpp:29:15: note: in instantiation of function template specialization 'builtin_pack::builtin_apply<(lambda
at main.cpp:42:16), pack, pack, pack>' requested here
this->builtin_apply ( f, t... );
^
main.cpp:42:8: note: in instantiation of function template specialization 'pack::apply<(lambda at
main.cpp:42:16), pack, pack, pack>' requested here
p3.apply ( [] ( long i, long j, long k )->long{return i | j | k;}, p1, p2, p3 );
^
main.cpp:22:14: note: implicitly declared private here
class pack : builtin_pack
^~~~~~~~~~~~
main.cpp:17:26: error: 'v' is a private member of 'builtin_pack'
v[i] = f ( t.v[i]... );
^
main.cpp:22:14: note: constrained by implicitly private inheritance here
class pack : builtin_pack
^~~~~~~~~~~~
main.cpp:5:10: note: member is declared here
long v[4];
^
2 errors generated.
我想做的是实现一个映射方法与自定义(lambda)函数(称为'apply')。当私有实实者-公共包装器的层次结构不存在时,它很容易工作,所以当数组v
刚好在类pack
中时,它会按预期编译和运行。但是,当数据存储在私有继承的类中时,它不起作用。
类的结构是一个私有实现者类和一个包装器类,在中间我遇到了这个错误。
我是否以错误的方式使用了可变模板?或者是否有可用的变通方法?
(很抱歉我的表达不佳,因为我是c++和stackoverflow的新手,母语不是英语,只要保留原意,欢迎对问题进行修改或建议!)
您的问题是使用私有继承,您无法从pack*
转换为builtin_pack*
(即pack
之外)。如果你转换它,代码编译,虽然我不确定这是否是你所追求的:
template<typename Func, typename... Targs>
pack& apply ( Func f, Targs ... t )
{
this->builtin_apply ( f, static_cast<builtin_pack&&>(t)... );
return *this;
}
现场演示
相关文章:
- 如何修复我的快速排序实现?
- 在我的四叉树实现中遇到问题
- 如何为我的类实现/重载二进制运算符
- 在我的trie实现中出现分段错误
- 我无法让我的合并排序实现运行
- 如何为我的容器实现随机访问迭代器?
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 如何测试我的谷歌身份验证器实现?
- 带有AUTOMOC的CMake正在删除我的实现
- 为什么我的C++实现比 R 源慢?
- 在我的实现中使用堆栈是否正确?
- 我的 A* 实现无法正确跟踪"camefrom"映射
- 拉盖尔插值算法,我的实现有问题
- std::is_function的实现——为什么我的实现行为不同
- 为什么 std::vector 这么快(或者我的实现太慢了)
- 我如何使用接口隐藏我的实现,并且仍然使用继承构建类
- 我如何在c++中使用可变模板,同时保持我的实现类私有
- 如何将我的实现包含在一些头文件(嵌套类)的cpp文件中