小编use*_*020的帖子

按值、常量值、引用、常量引用、指针、常量指针传递

探索更多并找到答案以确定如何传递旧帖子(抱歉重复)

  • 如果函数打算更改参数作为副作用,请通过非常量引用来获取它。
  • 如果函数不修改其参数并且参数是原始类型,则按值获取它。
  • 否则通过 const 引用获取它,以下情况除外
    • 如果该函数无论如何都需要制作 const 引用的副本,请按值获取它。

[原帖在下面]

我想总结一下按值传递、const 值、引用、const 引用、指针、const 指针的使用,请纠正我并给我您的建议。

  • 至于引用和指针,尽可能使用 const(感谢所有人)。
  • 通过引用和指针传递之间没有性能差异。
  • 当大小不大于指针时(感谢 Mark Ransom),按值传递。

还有一些问题:

  1. 我很少看到传递 const 值。它有用还是编译器会检测到按值传递的常量性?
  2. const 引用占用太多空间。我可以只使用按值传递吗?现代编译器会优化它而不牺牲性能吗?

根据juanchopanza 提到的“Want Speed? Pass by Value”一文,我再添加一项。

  • 如果您将复制您的参数,请按值传递它们并让编译器进行复制,而不是通过 const 引用传递它们并在函数体中自己进行复制。

非常感谢!

c++ parameter-passing

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

在智能指针容器中添加项目

在智能指针容器中添加项目的几种方法.我想知道你会选择哪种方式.

class MyContainer
{
private:
    std::vector<std::unique_ptr<Item>> mItems;

public:
    bool Add(Item* item);
    // This is Way 1
    //
    // Advantages: 
    // - Easy to add derived items, such as Add(new DerivedItem);
    // - No interface change if smart pointer type changes to such as shared_ptr;
    //
    // Disadvantages:
    // - Don't explicitly show the item to add must be allocated on heap;
    // - If failed to add, user has to delete the item.

    bool Add(std::unique_ptr<Item> item);
    // This is Way …
Run Code Online (Sandbox Code Playgroud)

c++ containers smart-pointers unique-ptr

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

如何为我的类生成一个std :: get like函数?

例如,我有一个班级

struct A {int a; bool b;};
Run Code Online (Sandbox Code Playgroud)

我想生成一个模板函数来获取它的元素(比如std :: get获取一个元组元素)

template<unsigned i, class T>
auto Get(T& t);

template<>
int& Get<0, A>(A& a)
{
    return a.a;
}

template<>
bool& Get<1, A>(A& a)
{
    return a.b;
}


int main()
{
    A a;
    Get<0>(a) = 10;
    Get<1>(a) = true;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用.挑战在于我不知道Get for any class的返回类型.有没有办法实现呢?谢谢.

c++ templates c++11

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

如何使用unique_ptr成员创建一个使用std :: move和std :: swap的类?

我上课了.它有unique_ptr的成员.

class A
{
    std::unique_ptr<int> m;
};
Run Code Online (Sandbox Code Playgroud)

我希望它适用于以下陈述

A a;
A b;
a = std::move(b);
std::swap(a, b);
Run Code Online (Sandbox Code Playgroud)

怎么做?

根据评论,我有一个问题.这个编译器是否依赖?如果我什么都不做,它就无法通过VC++ 2012中的编译.

我之前尝试过

struct A
{
    A() {}

    A(A&& a)
    {
        mb = a.mb;
        ma = std::move(a.ma);
    }

    A& operator = (A&& a)
    {
        mb = a.mb;
        ma = std::move(a.ma);
        return *this;
    }

    unique_ptr<int> ma;
    int mb;
};
Run Code Online (Sandbox Code Playgroud)

但不确定这是否是最好和最简单的方法.

c++ unique-ptr

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

有什么方法可以初始化unique_ptr的向量?

例如

struct A
{
    vector<unique_ptr<int>> m_vector { make_unique<int>(1), make_unique<int>(2) };
};
Run Code Online (Sandbox Code Playgroud)

我尝试上面但失败了.有什么方法可以初始化unique_ptr的向量?

c++ initialization c++11

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

如何在可变参数类型包中获取类型的索引?

例如

template<typename T, typename... Ts>
struct Index
{
    enum {value = ???}
};
Run Code Online (Sandbox Code Playgroud)

并且假设T是Ts中的一个,并且Ts具有不同的类型,例如

Index<int, int, double>::value is 0
Index<double, int, double>::value is 1
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

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

如何将std :: array转换为一个点?

我想构建一个模板函数来将std :: array转换为一个通用点,它有一个构造函数接受它的坐标参数.

template<typename PointT, size_t N>
PointT to(std::array<double, N> const& a)
{
    return PointT(a[0], a[1], ...); // How to expand a?
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法扩展阵列a

c++ arrays c++11

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

如何使用boost :: preprocessor解压缩序列?

如何使用boost :: preprocessor解压缩一对对?

例如,我有一个如下序列(逗号之间无关紧要)

(int,x)(double,y)(float,z) or
(int,x),(double,y),(float,z) or
((int)(x))((double)(y))((float)(z))
Run Code Online (Sandbox Code Playgroud)

并希望转换为

int,double,float
Run Code Online (Sandbox Code Playgroud)

x,y,z
Run Code Online (Sandbox Code Playgroud)

通过使用macor之类的

UNZIP(i, seq) 
Run Code Online (Sandbox Code Playgroud)

i索引在哪里

c++ boost boost-preprocessor

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

Anywhere显示doxygen文档中的所有免费功能?

我正在使用doxygen来记录我的代码.我发现我可以很容易地找到所有类,因为有一个tab calles"classes".但我无法将所有自由功能列在一起.我必须转到选项卡"文件"来查找它们.我可以将所有免费功能放在doxygen文档中吗?

c++ doxygen

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

如何为类中的模板定义类型别名

例如

struct Option_1
{
    template<class T> using Vector = std::vector<T>;
};
Run Code Online (Sandbox Code Playgroud)

我可以

typename Option_1::Vector<int> v;
Run Code Online (Sandbox Code Playgroud)

但我更喜欢下面的

Vector<Option_1, int> v;
Run Code Online (Sandbox Code Playgroud)

或不带“typename”一词的类似名称。我定义了一个别名

template<class Option, class T> using Vector= typename Option::Vector<T>;
Run Code Online (Sandbox Code Playgroud)

但由于无法识别的模板声明/定义而失败。如何修复它?

c++ templates using c++11 type-alias

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