- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要一种简单的方法来获取 T
类对象的计数/长度/大小在哪里 T
是某种集合类型,例如 std::map
, std::list
, std::vector
, CStringArray
, CString
, std::string
,……
对于大多数标准类型,T::size()
是正确答案,对于大多数 MFC 类 T::GetSize()
是正确的,对于 CString
, 是 T::GetLength()
.
我想点个赞:
template <typename T> auto size(const T & t)
...计算出正确的成员函数调用。
似乎应该有一种简单的方法来调用 T
上的特征模板其中有一个 size(const T & t)
成员,它本身使用 SFINAE 存在或不存在,如果存在,则根据定义调用适当的 t.size_function()
返回 T
的该实例中的元素计数.
我可以写一个详细的has_member
type-trait 模板 - 在 stackoverflow 上有一些示例 - 对于我看来“必须有更简单的方法”,所有这些示例都非常复杂。使用 C++ 17,这个问题似乎应该可以轻松优雅地解决?
这些讨论 here和 here似乎使用了一个不优雅的解决方案,其中一些答案使用预处理器宏来完成工作。这还有必要吗?
但是...当然,必须有一种方法可以使用在 T
上调用正确的成员函数这一事实。是可编译的,调用错误的无法编译 - 不能直接为给定类型创建正确的类型特征包装器T
?
我想要一些类似的东西:
template <typename T>
auto size(const T & collection)
{
return collection_traits<T>::count(collection);
}
collection_traits<T>
的确切特化在哪里被选中是因为它是唯一适合 T
的(即它调用正确的实例方法)。
最佳答案
您可以使用 expression SFINAE和多个重载。
思路如下:检查x.size()
是您的类型的有效表达式 - 如果是,则调用并返回它。重复 .getSize
和 .getLength
.
给定:
struct A { int size() const { return 42; } };
struct B { int getSize() const { return 42; } };
struct C { int GetLength() const { return 42; } };
您可以提供:
template <typename T>
auto size(const T& x) -> decltype(x.size()) { return x.size(); }
template <typename T>
auto size(const T& x) -> decltype(x.getSize()) { return x.getSize(); }
template <typename T>
auto size(const T& x) -> decltype(x.GetLength()) { return x.GetLength(); }
用法:
int main()
{
size(A{});
size(B{});
size(C{});
}
此解决方案易于扩展,并可与模板化容器无缝协作。
What if a type exposes two getters?
上述解决方案会导致歧义,但通过引入解决该问题的排名/排序很容易解决。
首先,我们可以创建一个 rank
允许我们任意确定重载优先级的类:
template <int N> struct rank : rank<N - 1> { };
template <> struct rank<0> { };
rank<N>
可隐式转换为 rank<N - 1>
.在重载解析期间,完全匹配比一连串的转换要好。
然后我们可以创建 size_impl
的层次结构重载:
template <typename T>
auto size_impl(const T& x, rank<2>)
-> decltype(x.size()) { return x.size(); }
template <typename T>
auto size_impl(const T& x, rank<1>)
-> decltype(x.getSize()) { return x.getSize(); }
template <typename T>
auto size_impl(const T& x, rank<0>)
-> decltype(x.GetLength()) { return x.GetLength(); }
最后我们提供一个接口(interface)函数,开始向右调度size_impl
过载:
template <typename T>
auto size(const T& x) -> decltype(size_impl(x, rank<2>{}))
{
return size_impl(x, rank<2>{});
}
使用像 D
这样的类型下面
struct D
{
int size() const { return 42; }
int getSize() const { return 42; }
int GetLength() const { return 42; }
};
现在将选择 rank<2>
size_impl
的过载:
关于c++ - 如何编写适用于任何类型集合对象的 size() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48648148/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!