STL定义了两种转换函数
第一个是对于一元运算符:
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);
Run Code Online (Sandbox Code Playgroud)
第二个是二元运算符:
template <class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);
Run Code Online (Sandbox Code Playgroud)
对于三元运算符,最有效的类似函数实现是什么?
编辑:这是我提出的简单实现,但是不是更精简和更优雅的解决方案吗?
template <class InputIterator1, class InputIterator2, class InputIterator3,
class OutputIterator, class TrenaryOperation>
OutputIterator transform3(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator3 first3, OutputIterator result,
TrenaryOperation trenary_op)
{
while (first1 != last1) {
*result = trenary_op(*first1, *first2, …
Run Code Online (Sandbox Code Playgroud) 大多数C++程序员都知道空基类优化作为一种技术/习惯用法.空子课程会发生什么?例如
class EmptyBase {
int i;
};
template<typename T>
class Derived : T {
};
std::cout << sizeof(Derived<EmptyBase>); // Is there a standard verdic on this?
Run Code Online (Sandbox Code Playgroud)
与EBO类似,应该有一个EDO声明由于派生类不提供任何更多成员,也没有将任何虚拟成员引入其参数化类型,因此它不需要更多内存.考虑到类似的东西可能会出现的各种情况(多重继承,单继承...):
注意:使用从其参数化类型派生的类模板是非常典型的.主题是关于在这种情况下的空间浪费
c++ optimization memory-management class compiler-optimization
我的代码有问题
这是它的简化版本:
#include <iostream>
class A
{
public :
template <class T>
void func(T&&)//accept rvalue
{
std::cout<<"in rvalue\n";
}
template <class T>
void func(const T&)//accept lvalue
{
std::cout<<"in lvalue\n";
}
};
int main()
{
A a;
double n=3;
a.func(n);
a.func(5);
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
但它是
in rvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
为什么?!
该set_difference算法需要以下
范围内的元素应按照相同的标准进行排序
哈希表不是这种情况.
我正在考虑根据std::remove_copy
移除标准在集合B中是否存在A的元素来实现集合差异AB .
是否有标准有效,最快最安全的方法?
在C++中,模板模板参数只能与class
关键字一起引入.为什么以下是非法的:
template<template<typename> typename C>
struct A {};
Run Code Online (Sandbox Code Playgroud)
鉴于最近的一项提案(在isocpp.org标题中有特色)试图克服它,我正在寻找这种限制背后的理性.
在一个类的虚拟示例中
typedef myStruct<myStruct<myStruct<int>>> mv;
Run Code Online (Sandbox Code Playgroud)
int
是最里面的模板参数.如何获取任意嵌套深度的参数类型?
获取最内层类型的机制
innermost<mv>::type -> int
Run Code Online (Sandbox Code Playgroud)
可以使用模板别名来完成(模板模板参数在这里是缺少的功能)吗?
在我的类型将是一个例子中
vector<vector<vector<int>>>
Run Code Online (Sandbox Code Playgroud)
有没有办法执行相同的操作,因为vector
需要额外的模板参数?当然,可以划分一个独特的实现,但是有没有办法扩展第一个问题的解决方案来处理这些情况呢?
假设我有一个测量类的时间,可以通过这样的持续时间类型进行参数化
template<typename TimeT = std::chrono::milliseconds>
struct measure
{ /* implementation */ };
Run Code Online (Sandbox Code Playgroud)
我想要的是能够打印出来的TimeT
.我倾向于实现这样的静态成员函数:
static string TimeType() const;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
typeinfo / name
组合(在这种情况下我必须删除constexpr
上面的内容)或者我应该选择创建几个特殊化,这些特化会在每种类型时返回正确的字符串吗?通用lambda可以利用"替换失败不是错误"规则吗?例
auto gL =
[](auto&& func, auto&& param1, auto&&... params)
-> enable_if_t< is_integral<
std::decay_t<decltype(param1)>
>::value>
{
// ...
};
auto gL =
[](auto&& func, auto&& param1, auto&&... params)
-> enable_if_t< !is_integral<
std::decay_t<decltype(param1)>
>::value>
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
是否有任何变通方法或计划将其包含在语言中?此外,由于通用lambda是引擎盖下的模板化功能对象,这是不是有点奇怪,这是不能做到的?
我有一个算法,从指针转换为类
std::vector<MyClass> input;
std::vector<MyClass*> ptrs;
std::vector<MyClass> output;
Run Code Online (Sandbox Code Playgroud)
所以要获得ptrs
我的帮助
transform(input.begin(), input.end(), back_inserter(ptrs), addressof<MyClass>);
Run Code Online (Sandbox Code Playgroud)
标准库中是否存在相反的操作,deref_of
以便我可以得到如下结果:
transform(ptrs.begin(), ptrs.end(), back_inserter(output), deref_of<MyClass*>);
Run Code Online (Sandbox Code Playgroud) 从相关的c ++标准部分:
引用构造函数的函数try-block的处理程序中的对象的任何非静态成员或基类,或该对象的析构函数导致未定义的行为.
例如.
T::~T()
{
try {
this->nonstatic_member; // iff I read the quote correctly
} catch( ... ) {
}
}
Run Code Online (Sandbox Code Playgroud)
那为什么这个未定义的行为?