小编use*_*020的帖子

如何在多继承中实现具有相同名称的虚函数

代码如下

// A has a virtual function F().
class A
{
public:
    virtual void F() {};
};

// The same for B.
class B
{
public:
    virtual void F() {};
};

// C inherits A and B.
class C : public A, public B
{
public:
    // How to implement the 2 virtual functions with the same name but from
    // different base classes.
    virtual F() {...}
};
Run Code Online (Sandbox Code Playgroud)

请注意,基类中有一个F()的默认实现.

感谢Jan Herrmann和Spook.如果我们必须使用一些额外的帮助,下面是一个更简单的解决方案吗?

#include <iostream>

// A has a virtual function F(). …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance

6
推荐指数
1
解决办法
5371
查看次数

如何初始化静态向量成员?

例如

struct A
{
    static vector<int> s;
};

vector<int> A::s = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但是,我的编译器不支持初始化列表.有什么办法可以轻松实现吗?lambda函数在这里有用吗?

c++ lambda static

6
推荐指数
1
解决办法
2万
查看次数

如何获得指针类型的指向类型?

我有一个指针类型Ptr.它可能是T*,unique_ptr,shared_ptr或其他.如何在编译时获取其尖头类型?我尝试以下但失败了

template<class Ptr>
void f()
{
    typedef decltype(*Ptr()) T; // give unexpected results
}
Run Code Online (Sandbox Code Playgroud)

以下删除的答案非常有效.

typedef typename std::remove_reference<decltype(*std::declval<Ptr>())>::type T;
Run Code Online (Sandbox Code Playgroud)

c++ type-traits

6
推荐指数
2
解决办法
2188
查看次数

具有对象初始化器语法的不可变类型

例如,我有一个不可变类型

class Contact
{
    // Read-only properties. 
    public string Name { get; }
    public string Address { get; }
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以使用对象初始化程序语法来创建联系人

Contact a = new Contact { Name = "John", Address = "23 Tennis RD" };
Run Code Online (Sandbox Code Playgroud)

但是我不能.在这种情况下,有任何可能的方法来使用强大的对象初始化器语法吗?

c# properties

6
推荐指数
1
解决办法
541
查看次数

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

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

  • 如果函数打算更改参数作为副作用,请通过非常量引用来获取它。
  • 如果函数不修改其参数并且参数是原始类型,则按值获取它。
  • 否则通过 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
查看次数

如何为我的类生成一个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
查看次数

如何使初始化列表隐式转换为类?

例如,我有一个班级

struct A
{
    A(int i, double d) {...}

private:
    int m_i;
    double m_d; 
};
Run Code Online (Sandbox Code Playgroud)

和带参数A的函数

void f(A a);
Run Code Online (Sandbox Code Playgroud)

我可以使用初始化列表来调用该函数

f( A{1, 3.14} );
Run Code Online (Sandbox Code Playgroud)

如何制作以下简单版本也有效?

f( {1, 3.14} );
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list

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

是否可以使用功能?

例如

template<class T, class U>
void f();

template<class T> using g = f<T, int>;
Run Code Online (Sandbox Code Playgroud)

或任何类似的功能的想法?

c++ using function c++11

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

有什么方法可以初始化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
查看次数

如何使用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
查看次数