小编Vit*_*meo的帖子

正确的方式来声明/定义类似自定义cout的对象

我创建了自己std::cout的对象,它既可以写入std::cout日志文件,也可以写入日志文件.

我目前正在头文件中定义它,但我收到了未使用的变量警告.

头文件 <MyLib/Log.h>

static LOut { };
static LOut lo;

template<typename T> inline LOut& operator<<(LOut& mLOut, const T& mValue)
{
    std::string str{toStr(mValue)};
    std::cout << str;
    getLogStream() << str;
    return mLOut;
}
Run Code Online (Sandbox Code Playgroud)

用法:

#include <MyLib/Log.h>
...
lo << "hello!" << std::endl;
Run Code Online (Sandbox Code Playgroud)

应该lostatic?应该loextern

Kudos用于解释声明类似cout对象的正确方法,并展示主标准库实现如何实现它.


编辑:by- coutlike对象,我的意思是一个全局变量,在包含相应的头之后始终可用.

c++ static global-variables extern c++11

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

用于统一块集合中的连续块的算法

我正在创建一个具有动态内存块大小的预分配器,我需要统一连续的内存块.

struct Chunk // Chunk of memory
{
    Ptr begin, end; // [begin, end) range
}

struct PreAlloc
{
    std::vector<Chunk> chunks; // I need to unify contiguous chunks here
    ...
}
Run Code Online (Sandbox Code Playgroud)

我尝试了一个天真的解决方案,在根据它们对块进行排序后begin,基本上通过向量检查是否下一个块begin是否等于当前块end.我相信它可以改进.

是否有一个很好的算法来统一连续的范围

信息:

  • 大块永远不会"重叠".
  • 块可以具有大于0的任何大小.
  • 性能是最重要的因素.

c++ memory sorting algorithm c++11

7
推荐指数
2
解决办法
876
查看次数

原始调用者被销毁后,std :: thread :: detach导致崩溃

struct Test {
    bool active{true};

    void threadedUpdate() {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        if(!active) // crashes here after Test instance is destroyed
            return; 
    }

    Test() { 
        std::thread([this]{ while(true) threadedUpdate(); }).detach();
    }

    ~Test() { 
        // somehow stop the detached thread?
    } 
};
Run Code Online (Sandbox Code Playgroud)

Test初始化实例时,它会生成并分离std::thread在后台运行的实例.当同一个实例被销毁时,前面提到的线程试图访问该active成员,该成员与实例一起被销毁,导致崩溃(和一个AddressSanitizer回溯).

有没有办法停止分离的线程~Test()

设计很糟糕.如果正确生成/处理在调用者被销毁之前,如何在后台运行线程?

c++ multithreading detach c++11 stdthread

7
推荐指数
2
解决办法
2962
查看次数

让一位同事相信他们是否没有被嵌套

今年开始编程的我的一位大学同事有时写下这样的陈述:

if(something) doA();
else
    if(something2) doC();
    else doD();
Run Code Online (Sandbox Code Playgroud)

他被认为第二if-else对被视为单个实体,并且它实际上嵌套在第一对之下else.

但是,我确信他的代码相当于:

if(something) doA();
else if(something2) doC();
else doD();
Run Code Online (Sandbox Code Playgroud)

这表明第二个else实际上并不是嵌套的,而是与第一个if相同的级别.我告诉他,他需要用花括号来达到他想要的效果.

"但我的代码按预期工作!"

事实上,它按预期工作.事实证明代码的行为是相同的,即使else没有嵌套.

令人惊讶的是,我发现自己无法写出一个清晰简洁的例子,显示出不同的行为

if(something) doA();
else
    if(something2) doC();
    else doD();
Run Code Online (Sandbox Code Playgroud)

if(something) doA();
else {
    if(something2) doC();
    else doD();
}
Run Code Online (Sandbox Code Playgroud)

你能帮我找一个例子,告诉我的同事使用/不使用花括号之间的区别吗?

或者,就行为而言,看起来不正确的版本总是等同于花括号的版本?

c c++ if-statement nested

7
推荐指数
2
解决办法
303
查看次数

使用`void_t`检查类是否具有特定签名的方法

目前,我正在使用此方法来检查类是否具有特定签名的方法.

在参加了Walter E. Brown的元编程CppCon2014演讲之后,我开始想知道是否void_t可以在这种特殊情况下使用它来使代码更清晰,更易读.

但是我在思考方面遇到了麻烦 void_t- 到目前为止我理解这void_t可以帮助我在编译时确定表达式是否有效.

例:

template< class, class = void >
struct has_type_data_member : false_type { };

template< class T >
struct has_type_data_member<T, void_t<decltype(T::data)>> : true_type { };
Run Code Online (Sandbox Code Playgroud)

如果decltype(T::type)是有效表达式,则为has_type_data_member<T>真正的编译时常量.因此,我们确信T有一个成员字段data.

我想使用相同的方法来检查类型T是否具有具有特定名称和特定签名的方法.

假设我想检查是否T有一个名为getCount()return 的方法int.这是我期望的工作((Ideone.com链接)):

template< class, class = void >
struct hasGetCount : false_type { };

template< class T >
struct hasGetCount<T, VoidT<decltype(T::getCount)>> …
Run Code Online (Sandbox Code Playgroud)

c++ templates void template-meta-programming c++14

7
推荐指数
2
解决办法
2538
查看次数

.htaccess - 默默地重写/重定向一切到内部子文件夹

假设我有这个www.example.com网站结构:

/srv/http/
/srv/http/site/index.php
/srv/http/site/stuff.php
Run Code Online (Sandbox Code Playgroud)

我希望以下重写/重定向发生:

www.example.com/index.php- >重定向到 - > www.example.com/site/index.php- >但用户看到 - >www.example.com/index.php

www.example.com/stuff.php- >重定向到 - > www.example.com/site/stuff.php- >但用户看到 - >www.example.com/stuff.php

通常,www.example.com/重定向到之后的所有内容www.example.com/site/.但是用户在浏览器中看到原始URL.

我在互联网上环顾四周,但没有设法弄清楚在这种情况下使用什么.

我尝试重写一切:

RewriteEngine On
RewriteRule ^$ /site [L]
Run Code Online (Sandbox Code Playgroud)

index.php消失并向www.example.com/site/用户显示.

.htaccess该如何使用来解决这个问题?

apache .htaccess mod-rewrite redirect

7
推荐指数
2
解决办法
7184
查看次数

干净地压制gcc的'final`建议警告(`-Wsuggest-final-types`和`-Wsuggest-final-methods`)

我喜欢使用-Wsuggest-final-types-Wsuggest-final-methods编译我的代码,以便警告final关键字可用于允许编译器更积极地优化的机会.

但有时候,建议是不正确的 - 例如,我有一个Base带有virtual ~Base()析构函数的类,在另一个项目中以多态方式使用,gcc建议我Base可以标记为final.

有没有办法"干净地"告诉编译器Base多态使用并且不应该标记为final

我能想到的唯一方法是使用#pragma指令,但我发现它使代码混乱且难以阅读.

理想情况下,我正在寻找non-final可以在类/方法声明中添加/附加的关键字或属性.

c++ gcc warnings final

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

是否可以使用`std :: set_intersection`来检查两个集合是否有任何共同的元素?

std::set_intersection允许我std::set通过输出元素到输出迭代器来检索两个实例之间的所有共同元素.在我的特殊情况下,我只想检查两组是否有任何共同的元素.

我目前的解决方案是使用如下boost::function_output_iterator设置bool变量:

bool b{false};
set_intersection(begin(s0), end(s0),
                 begin(s1), end(s1),
                 make_function_output_iterator([&](const auto&){ b = true; }));
return b;
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果找到匹配项,此解决方案不会提前返回:必须完全遍历集合(即没有提前返回/短路).

是否可以set_intersection提前退货?我能想到的唯一解决方案是从function_output_iterator 函数对象中抛出异常,这是一个可怕的想法.

如果没有,标准库中还有什么可以帮助我,还是我被迫重新实现set_intersection?额外的问题:set_intersection如果它允许提前终止(即标准库算法可能具有的"最通用"接口),界面会如何

c++ iterator stl set c++17

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

匿名临时和类模板参数演绎 - gcc vs clang

请考虑以下代码段:

template <typename T>
struct foo
{
    foo(T) { }
};

int main()
{
    foo{0};
}
Run Code Online (Sandbox Code Playgroud)

g ++ 7愉快地创建了一个类型的临时对象foo,演绎T = int.

clang ++ 5和6拒绝编译代码:

error: expected unqualified-id
    foo{0};
       ^
Run Code Online (Sandbox Code Playgroud)

wandbox上的实例


这是一个铿锵的错误,还是标准中的某些内容阻止了类模板参数推断对于未命名的临时工具的推动?

c++ language-lawyer class-template argument-deduction c++17

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

通用lambda及其参数作为常量表达式

以下代码被GCC 7.2和clang 5.0.0接受,但被Microsoft VS 2017 15.5.0 Preview 5和Intel C++编译器19拒绝:

struct S { };

constexpr int f(S)
{
    return 0;
}

int main()
{
    auto lambda = [](auto x)
    {
        constexpr int e = f(x);
    };

    lambda(S{});
}
Run Code Online (Sandbox Code Playgroud)

微软:

<source>(12): error C2131: expression did not evaluate to a constant
Run Code Online (Sandbox Code Playgroud)

英特尔:

<source>(12): error: expression must have a constant value
    constexpr int e = f(x);
                      ^
<source>(12): note: the value of parameter "x" (declared at line 10) cannot be used as a constant …
Run Code Online (Sandbox Code Playgroud)

c++ lambda language-lawyer c++14

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