- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有两个结构:
// ----- non-const -----
struct arg_adapter
{
EArgType type; // fmtA, fmtB, ...
union
{
TypeA * valueA;
TypeB * valueB;
// ... more types
}
arg_adapter(TypeA & value) : type(fmtA), valueA(&value) {}
arg_adapter(TypeB & value) : type(fmtB), valueB(&value) {}
// ...
}
// ----- const version -----
struct const_arg_adapter
{
EArgType type; // fmtA, fmtB, ...
union
{
TypeA const * valueA;
TypeB const * valueB;
// ... more types
}
arg_adapter(TypeA const & value) : type(fmtA), valueA(&value) {}
arg_adapter(TypeB const & value) : type(fmtB), valueB(&value) {}
// ...
}
它们应该用于以下方法:
Convert(const_arg_adapter from, arg_adapter to)
TypeX 有多个(大约 5 个,可能会更多),其中大部分是原始的。这是为了避免维护不同的原型(prototype)。
现在我的问题 ;-)
有没有办法让 const-ness 成为模板参数?我的目标是只维护一个结构,即
template <Qualifier CONSTNESS>
struct arg_adapter_t
{
...
CONSTNESS TypeA * valueA;
...
}
最佳答案
你可以让它接受 metafunction你可以应用任何你喜欢的转换
template<template<typename> class F>
struct arg_adapter
{
EArgType type; // fmtA, fmtB, ...
union
{
typename F<TypeA>::type * valueA;
typename F<TypeB>::type * valueB;
// ... more types
};
arg_adapter(typename F<TypeA>::type & value) : type(fmtA), valueA(&value) {}
arg_adapter(typename F<TypeB>::type & value) : type(fmtB), valueB(&value) {}
// ...
};
typename arg_adapter<boost::add_const> const_adapter;
typename arg_adapter<boost::mpl::identity> nonconst_adapter;
或接受 metafunction class获得更大的灵 active (包括使 F
具有您的 arg_adapter
不知道的默认参数等的能力。
template<typename F>
struct arg_adapter
{
EArgType type; // fmtA, fmtB, ...
union
{
typename apply<F, TypeA>::type * valueA;
typename apply<F, TypeB>::type * valueB;
// ... more types
};
arg_adapter(typename apply<F, TypeA>::type & value) : type(fmtA), valueA(&value) {}
arg_adapter(typename apply<F, TypeB>::type & value) : type(fmtB), valueB(&value) {}
// ...
};
typename arg_adapter< lambda< boost::add_const<_> >::type > const_adapter;
typename arg_adapter< lambda< boost::mpl::identity<_> >::type > nonconst_adapter;
关于c++ - const-ness 作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3686449/
我正在尝试使用新的 c++17 类模板推导,在我应用 const 之前它似乎一切正常。这是我面临的麻烦的一个小例子: #include template struct X { T _dat
我正在使用整洁的 fmt 库,在其版本 8 中,如果编译器支持相关功能,则会对其格式字符串进行编译时检查。 在某个时候,我想编写以下代码: throw my_exception("error: {}"
我有一些实现图形算法的代码;特别是,有这些片段会导致问题: class Path{ private: const Graph* graph; public: Path(Graph* g
void foo (void *p); // library function; can't edit template void Remove (T *p) { // main code f
class Foo{}; class BarParent { Foo* p_foo; public: BarParent(Foo * const p_x) //OR BarPa
考虑以下 C++ 代码: typedef std::string& mutable_string_ref; const std::string str = "abc"; mutable_string_
我正在尝试从变量 (char*) 中移除常量特性,但出于某种原因,当我尝试更改值时,常量变量的原始值仍然保持不变。 const char* str1 = "david"; char* str2 =
我正在运行目标:tomcat:deploy。没有错误,但它没有将我的项目部署到 tomcat 中。我注意到这条消息: [INFO] Skipping non-war project 什么定义了我的项目
出于各种原因,我正在寻找一种方法来捕获传递给函数的参数的constexpr-ness。解释起来有点棘手,所以我认为代码最能展示我想要实现的目标 #include // For std::size_t
如果我创建了一个 C 模块,它向用户提供一个指向前向声明结构的句柄,如下所示: typedef struct FOO_Obj *FOO_Handle; 如果我然后声明将其用作 const 限定参数的函
我有两个结构: // ----- non-const ----- struct arg_adapter { EArgType type; // fmtA, fmtB, ...
为什么 width 在第一次实例化后不保持其 constness? template class ProjectionTest { std::array _arr; public: P
给定: template inline bool f( T n ) { return n >= 0 && n = 0 is always true 当 T 是 unsigned 类型时,有什么聪明
在最坏的情况下,从已知列表创建二叉树的时间复杂度为 O(n2),但平均情况为 O(n logn)。最坏情况和平均情况之间的差异取决于树在创建后的不平衡程度。如果 maxDepth == n,那么这是最
我有一个对象,在最基本的层面上看起来像这样: #include class x_link { public: x_link() { d
我偶然发现了一些看似正确的代码。它应该提供一个公共(public)的、不可变的指针,同时将可修改的非常量指针保持私有(private)。 奇怪的是,这段代码在 SN C++ 编译器(适用于 PlayS
This page说make_optional C++17 中的函数返回 constexpr optional .我认为(虽然我可能是错的)这需要 optional有一个 constexpr复制或移动
我已经编写了以下代码来测试跨函数调用的 noexcept 传播,它似乎并没有像我想象的那样工作。在 GCC 4.7.2 中,可以有效地测试函数是否为 noexcept 仅直接或作为模板特化参数传递时;
最近,我一直在养成一种习惯,将我的代码中的许多东西作为const: (1) 函数参数,我知道永远不会改变。例如: void foo (const int i, const string s)
我有一个关于 POD-ness 的问题。我预计如果 B 是非 POD 而 B 是 A 的成员,那么 A 也是非 POD。但是,以下代码示例输出“10”,因此 B 被正确地视为非 POD,但 A 是。
我是一名优秀的程序员,十分优秀!