- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想访问 vector 中类型删除类型的 getter。 getter 被标记为 const。不知何故,const-ness 不会传播到 boost::any 包装器对象。最小的例子
#include <iostream>
#include <vector>
#include <boost/mpl/vector.hpp>
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>
using namespace boost;
using namespace boost::type_erasure;
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1)
using AnyTest = any<mpl::vector<copy_constructible<>,
has_test<int(double)>,
relaxed>>;
struct ATest {
int test(double x) const {
return 5;
}
};
int main() {
auto xs = std::vector<AnyTest>{};
xs.push_back(ATest{});
for (const auto& x : xs) {
std::cout << x.test(42.0) << '\n';
}
}
导致错误提示
clang++ -O3 -std=c++14 minimal.cc -o minimal
minimal.cc:28:18: error: member function 'test' not viable: 'this' argument has type 'const
boost::type_erasure::any<boost::mpl::vector<boost::type_erasure::copy_constructible<boost::type_erasure::_self>, has_test<int (double),
boost::type_erasure::_self>, boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::type_erasure::_self>', but
function is not marked const
std::cout << x.test(42.0) << '\n';
^
minimal.cc:11:39: note: 'test' declared here
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1)
^
/opt/local/include/boost/type_erasure/member.hpp:133:9: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER'
member, \
^
/opt/local/include/boost/type_erasure/member.hpp:242:64: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER_I'
BOOST_TYPE_ERASURE_MEMBER_II(namespace_name, concept_name, member, N)
^
/opt/local/include/boost/type_erasure/member.hpp:170:44: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER_II'
typename rebind_any<Base, R>::type member( \
^
1 error generated.
make: *** [minimal] Error 1
但是,一旦将 for 循环中的 const auto& x
更改为 auto& x
,它就可以工作了。这是什么原因,我怎样才能要求包装器对象遵守常量性?
最佳答案
你需要像这样在概念中指定const-ness:
using AnyTest = any<mpl::vector<
copy_constructible<>,
has_test<int(double), const _self>, relaxed>
>;
在文档中找到 page "Basic Usage"
// http://stackoverflow.com/questions/32743594/boost-type-erasure-any-with-const-member-function
#include <iostream>
#include <vector>
#include <boost/mpl/vector.hpp>
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>
using namespace boost;
using namespace boost::type_erasure;
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1)
using AnyTest = any<mpl::vector<
copy_constructible<>,
has_test<int(double), const _self>, relaxed>
>;
struct ATest {
int test(double) const { return 5; }
};
int main() {
auto xs = std::vector<AnyTest>{};
xs.push_back(ATest{});
for (auto const &x : xs) {
std::cout << x.test(42.0) << '\n';
}
}
打印
5
关于c++ - 使用 const 成员函数 boost type_erasure any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32743594/
我在我的代码库中使用 boost.type_erasure。到目前为止的经验,考虑到它的功能,效果非常好。 我希望能够为我的 API 转发声明一个“类型删除的引用类型”。这在 using 和 type
我正在尝试了解类型删除技术,正如所讨论的 here并在 adobe::poly 和 Boost::TypeErasure 中实现。不幸的是,我似乎缺少对占位符的基本理解;我目前正在努力理解 boost
我想访问 vector 中类型删除类型的 getter。 getter 被标记为 const。不知何故,const-ness 不会传播到 boost::any 包装器对象。最小的例子 #include
考虑这个非常简单的程序: #include #include int main() { return 0; } 编译失败: include/boost/type_erasure/is_
是否可以声明 boost::type_erasure::any以从字符串文字或 char const* 构造和分配的方式自动将字符串复制到 std::string 并将其存储在 boost::type
我是一名优秀的程序员,十分优秀!