小编Nik*_*iou的帖子

最好的STL变换 - 就像三元运算符的模板函数一样

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++ algorithm stl

5
推荐指数
1
解决办法
760
查看次数

空派生优化

大多数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声明由于派生类不提供任何更多成员,也没有将任何虚拟成员引入其参数化类型,因此它不需要更多内存.考虑到类似的东西可能会出现的各种情况(多重继承,单继承...):

  • 这样的优化标准/可能吗?
  • 如果是,这种优化的机制什么,它们与EBO相似吗?

注意:使用从其参数化类型派生的类模板是非常典型的.主题是关于在这种情况下的空间浪费

c++ optimization memory-management class compiler-optimization

5
推荐指数
1
解决办法
539
查看次数

功能模板无法识别左值

我的代码有问题

这是它的简化版本:

#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)

为什么?!

c++ templates rvalue lvalue c++11

5
推荐指数
2
解决办法
205
查看次数

在无序集上执行set_difference

set_difference算法需要以下

范围内的元素应按照相同的标准进行排序

哈希表不是这种情况.

我正在考虑根据std::remove_copy移除标准在集合B中是否存在A的元素来实现集合差异AB .

是否有标准有效,最快最安全的方法?

c++ stl

5
推荐指数
1
解决办法
5203
查看次数

为什么不能使用"typename"引入模板模板参数?

在C++中,模板模板参数只能与class关键字一起引入.为什么以下是非法的:

template<template<typename> typename C>
struct A {};
Run Code Online (Sandbox Code Playgroud)

鉴于最近的一项提案(在isocpp.org标题中有特色)试图克服它,我正在寻找这种限制背后的理性.

c++

5
推荐指数
0
解决办法
119
查看次数

如何获取最里面的模板参数类型?

Q

在一个类的虚拟示例中

typedef myStruct<myStruct<myStruct<int>>> mv;
Run Code Online (Sandbox Code Playgroud)

int是最里面的模板参数.如何获取任意嵌套深度的参数类型?

期望的结果

获取最内层类型的机制

innermost<mv>::type -> int
Run Code Online (Sandbox Code Playgroud)

愿望清单

  1. 可以使用模板别名来完成(模板模板参数在这里是缺少的功能)吗?

  2. 在我的类型将是一个例子中

    vector<vector<vector<int>>>
    
    Run Code Online (Sandbox Code Playgroud)

    有没有办法执行相同的操作,因为vector需要额外的模板参数?当然,可以划分一个独特的实现,但是有没有办法扩展第一个问题的解决方案来处理这些情况呢?

c++ templates template-meta-programming c++11

5
推荐指数
2
解决办法
865
查看次数

在chrono中获取时间类型的名称

假设我有一个测量类的时间,可以通过这样的持续时间类型进行参数化

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)

我的问题是:

  1. 我应该添加会员吗?这不应该是静态的吗?
  2. 如何实施这个体制?我应该使用依赖于实现的非编译时typeinfo / name组合(在这种情况下我必须删除constexpr上面的内容)或者我应该选择创建几个特殊化,这些特化会在每种类型时返回正确的字符串吗?
  3. 是否有更标准/惯用的方式来获取时间类型的名称?

c++ c++11 c++-chrono c++14

5
推荐指数
2
解决办法
436
查看次数

将SFINAE与通用lambda一起使用

通用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是引擎盖下的模板化功能对象,这是不是有点奇怪,这是不能做到的?

c++ lambda sfinae generic-lambda c++14

5
推荐指数
1
解决办法
973
查看次数

是否有标准的库函数,与addressof相反?

我有一个算法,从指针转换为类

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++

4
推荐指数
2
解决办法
169
查看次数

ISO c ++ 15.3.10:为什么这种未定义的行为?

从相关的c ++标准部分:

引用构造函数的函数try-block的处理程序中的对象的任何非静态成员或基类,或该对象的析构函数导致未定义的行为.

例如.

T::~T() 
{
      try {
        this->nonstatic_member; // iff I read the quote correctly
      } catch( ... ) {
      }
}
Run Code Online (Sandbox Code Playgroud)

那为什么这个未定义的行为?

c++ language-lawyer c++11

4
推荐指数
2
解决办法
259
查看次数