我创建了自己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)
应该lo是static?应该lo是extern?
Kudos用于解释声明类似cout对象的正确方法,并展示主标准库实现如何实现它.
编辑:by- coutlike对象,我的意思是一个全局变量,在包含相应的头之后始终可用.
我正在创建一个具有动态内存块大小的预分配器,我需要统一连续的内存块.
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.我相信它可以改进.
是否有一个很好的算法来统一连续的范围?
信息:
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()?
设计很糟糕.如果正确生成/处理在调用者被销毁之前,如何在后台运行线程?
今年开始编程的我的一位大学同事有时写下这样的陈述:
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)
你能帮我找一个例子,告诉我的同事使用/不使用花括号之间的区别吗?
或者,就行为而言,看起来不正确的版本总是等同于花括号的版本?
目前,我正在使用此方法来检查类是否具有特定签名的方法.
在参加了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) 假设我有这个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该如何使用来解决这个问题?
我喜欢使用-Wsuggest-final-types和-Wsuggest-final-methods编译我的代码,以便警告final关键字可用于允许编译器更积极地优化的机会.
但有时候,建议是不正确的 - 例如,我有一个Base带有virtual ~Base()析构函数的类,在另一个项目中以多态方式使用,gcc建议我Base可以标记为final.
有没有办法"干净地"告诉编译器Base多态使用并且不应该标记为final?
我能想到的唯一方法是使用#pragma指令,但我发现它使代码混乱且难以阅读.
理想情况下,我正在寻找non-final可以在类/方法声明中添加/附加的关键字或属性.
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如果它允许提前终止(即标准库算法可能具有的"最通用"接口),界面会如何?
请考虑以下代码段:
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拒绝编译代码:
Run Code Online (Sandbox Code Playgroud)error: expected unqualified-id foo{0}; ^
这是一个铿锵的错误,还是标准中的某些内容阻止了类模板参数推断对于未命名的临时工具的推动?
以下代码被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)