小编Hiu*_*ura的帖子

shared_ptr <T>到shared_ptr <T const>,vector <T>到vector <T const>

我正在尝试为我的软件定义一个好的设计,这意味着要小心对某些变量的读/写访问.在这里,我简化了讨论的程序.希望这对其他人也有帮助.:-)

假设我们有一个类X如下:

class X {
    int x;
public:
    X(int y) : x(y) { }
    void print() const { std::cout << "X::" << x << std::endl; }
    void foo() { ++x; }
};
Run Code Online (Sandbox Code Playgroud)

我们还要说,将来这个类将被子类化为X1,X2,......这可以重新实现print()foo().(virtual为了简单起见,我省略了所需的关键字,因为它不是我面临的实际问题.)

既然我们将使用polymorphisme,那么让我们使用(智能)指针并定义一个简单的工厂:

using XPtr = std::shared_ptr<X>;
using ConstXPtr = std::shared_ptr<X const>;

XPtr createX(int x) { return std::make_shared<X>(x); }
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好:我可以定义goo(p)哪些可以读写p,hoo(p)哪些只能读取p.

void goo(XPtr p) {
    p->print();
    p->foo();
    p->print();
}

void hoo(ConstXPtr p) {
    p->print();
//    p->foo(); …
Run Code Online (Sandbox Code Playgroud)

c++ const shared-ptr stdvector c++11

11
推荐指数
2
解决办法
3756
查看次数

C++ lambdas如何/可以保留内部状态?

我有一个基本的lambda,看起来像这样:

auto l = [](){
  int i = 0;
  cout << i++;
}
Run Code Online (Sandbox Code Playgroud)

多次打电话,将继续打印0.如何保留我?我可以不用仿函数吗?

c++ lambda

7
推荐指数
3
解决办法
1574
查看次数

为什么jvm在推送堆栈之前将byte&short扩展为int?

java代码:,

byte a_b = 12;
short c_d = 14
Run Code Online (Sandbox Code Playgroud)

用字节码替换

bipush  12 // expands byte1 (a byte type) to an int and pushes it onto the stack
sipush   14 // expands byte1, byte2 (a short type) to an int and pushes it onto the stack
Run Code Online (Sandbox Code Playgroud)

为什么jvm会进行扩展,而不是使用byte和short?

当我打开我的文件的字节码时

编辑:short var = 14被bipush 14取代而不是sipush 14

我的理解不清楚还是有错误?

在此输入图像描述

我正在使用以下版本

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

java byte jvm bytecode short

4
推荐指数
1
解决办法
735
查看次数

具有无效成员函数的模板类

在C++中使用不能与其某些成员函数一起使用的类来实例化类模板是否合法?

例如:

class A {
public:
    void f() { }
};

class B {  
};

template<typename T>
class Wrapper {
private:
    T t_;
public:
    void call_f() { t_.f(); }
};

int main() {
    Wrapper<A> a;
    Wrapper<B> b;
    a.call_f();
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译,我可以使用b,只要我不试图打电话b.call_f().(还显式实例化它template class Wrapper<B>;会导致编译错误,因为它会实例化所有成员函数.)

这是保证工作还是未定义的行为?如果是这样,那么随着概念和要求的引入,这将在C++ 17中发生变化吗?

c++ templates c++17

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

C++ 中不熟悉的符号 [=]

当我遇到一行我从未见过的代码时,我正在使用 SFML 开发一个游戏,并且正在阅读一些教程。完整内容在SFML 游戏开发,但特定符号是 [=],这里是代码的简化形式。

template <typename data_type, typename Function>
std::function<void(data_type1&)> foo(Function x)
{
    return [=] (data_type1 y)
    {
        DoSomething(y);
    };
}
Run Code Online (Sandbox Code Playgroud)

我想我明白了代码的意思,但是等号周围的括号有什么意义?我没有在任何网站上找到提及它,除非我只是使用了糟糕的搜索词。

c++ templates sfml

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

constexpr函数返回类型是非const吗?

我已经读过constexpr函数返回类型可以是非常量的,在我的书中也有这样的代码:

constexpr bool isShorter(const string& str1, const string& str2)
{
    return str1.size() < str2.size();
}
Run Code Online (Sandbox Code Playgroud)

但是在str1.size()这下面有一个错误:constexpr函数返回是非常量的.根据这本书,它必须是正确的,但编译器不同意.

每次我constexpr在不同的代码中使用时总会出现这样的错误:缺少类型说明符 - 假设为int.注意:C++不支持default-int.但我不知道这意味着什么.

c++

-3
推荐指数
1
解决办法
917
查看次数

标签 统计

c++ ×5

templates ×2

byte ×1

bytecode ×1

c++11 ×1

c++17 ×1

const ×1

java ×1

jvm ×1

lambda ×1

sfml ×1

shared-ptr ×1

short ×1

stdvector ×1