是否存在只返回其参数的std函数
Is there an std function that only returns its parameter?
实现起来应该很简单,比如
template<typename T>
T & as_is(T & t) { return t; }
尽管如此,我还是不想写它(:
我在www.cplusplus.com上没有找到这样的东西。
对于那些会问"你想做什么"的人来说,事情是这样的。我有一个类,它用漂亮的填充和所有的东西来构建ascii表。我不谈细节。重要的是它存储字符串(这样它就可以计算要填充多少)。我想实现一个排序函数,并能够告诉类将列用作某个类型。如果我想按一列int(同样是内部字符串)排序,我会传递atoi
。如果对字符串进行排序,我希望传递as_is
或stl等价项(如果有的话)。
为什么不重载函数而不传递任何东西?
顺便说一句,如果你使用的是MSVC,他们有identity
类模板,它有一个重载的operator()
,返回输入。所以理论上,你可以通过std::identity<std::string>()
,但我想说,只需要构建你自己的identity
函数。
不能像传递函数一样传递模板,因此std::forward和假设的nonst::identity函数都不能按原样工作。您需要明确设置转换的目标类型:
table.SortColumnUsing(3, nonstd::identity<std::string>);
这对我来说似乎有点难看,因为模板专用化中的类型是表的内部实现的一个特性,而不是与我希望表序列化为的类型有关,以便进行排序。或者,您可能并没有真正将列存储为std::string。
atoi作为类型描述符是如何工作的?atoi需要一个char*,而不是std::字符串,而且我认为您不能将int(const char*)
隐式转换为int(const std::string&)
。即使你可以这样做,你使用什么类型的int(const std::string&)
和Banana(const std string&)
。也许我不完全理解你问题的上下文,或者你有一些C++技巧,我很想学习。
我倾向于传递比较函数,而不是转换函数。这将导致一个单一的常量函数类型,可能是bool(const std::string&, const std::string&)
。这也可能使实现更简单,例如,对特定列进行不区分大小写或特定于区域设置的字符串比较,或者其他方便用户界面的排序技巧(比如将文件夹放在列表的顶部:首先检查是否只有一个字符串有尾随/,否则使用标准比较。)不过,这并不能真正解决专业化问题;对于std::string
的情况,您仍然会得到std::less<std::string>
(它至少存在)
不是一个好答案,我知道。。。但时间太长,无法发表评论。
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数