小编NoS*_*tAl的帖子

getline问题和"奇怪的人物"

我有一个奇怪的问题,我用

wifstream a("a.txt");
wstring line;
while (a.good()) //!a.eof()  not helping
{
     getline (a,line);
      //...
     wcout<<line<<endl;

}
Run Code Online (Sandbox Code Playgroud)

和它的作品很好地为这样的txt文件 http://www.speedyshare.com/files/29833132/a.txt (抱歉的联系,但它仅仅是80个字节,所以它不应该是一个问题,得到它,如果SO换行上的ic/p丢失了)但是当我添加例如水(来自http://en.wikipedia.org/wiki/UTF-16/UCS-2#Examples)到任何加载线的行时停止.我错误的认为getline将wstring作为一个输入和wifstream,因为其他人可以咀嚼任何txt输入...有没有办法读取文件中的每一行,即使它包含时髦的字符?

c++ wstring

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

使用一个值为std :: shared_ptr的map是一个很好的设计选择,用于拥有多索引的类列表?

问题很简单:我们有一个有成员a,b,c,d的类...我们希望能够快速搜索(键是一个成员的值)并通过提供当前值来更新具有新值的类列表或者b或c ......我想过要一堆
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>.

1)这是个好主意吗?

2)boost multi index在各方面都优于这个手工解决方案吗?

出于简单/性能原因,PS SQL是不可能的.

c++ stdmap shared-ptr boost-multi-index c++11

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

Doxygen是否支持分支或C/C++预处理器

这可能听起来像科幻功能请求,但我想知道Doxygen是否具有以下两个功能中的任何一个:

  1. 在预处理器运行输入文件之后生成调用/调用者图形.例:

    #define MULTITHREADING 1
    
    Run Code Online (Sandbox Code Playgroud)

    然后启用或禁用代码块,具体取决于是否MULTITHREADING 启用.

  2. 用图形箭头描述调用确定性 ...例如,如果不总是调用函数,则使用虚线(也就是说它在分支中,或者return在调用函数之前有可能).

c c++ doxygen

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

将const添加到size_t会导致编译失败是标准行为吗?

我最近阅读了很酷的文章:https: //akrzemi1.wordpress.com/2015/08/20/can-you-see-the-bug/在ideone上使用简化版本我得到了令人惊讶的行为:

#include <iostream>
#include <cassert>
using namespace std;
int main() {
    const size_t sz=258;
    string s{sz,'#'};
    assert(2==s.size());
}
Run Code Online (Sandbox Code Playgroud)

不编译,但与const删除编译相同的程序:

#include <iostream>
#include <cassert>
using namespace std;
int main() {
    size_t sz=258;
    string s{sz,'#'};
    assert(2==s.size());
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是这个标准要求或只是编译器决定一个是编译器警告而另一个是编译器错误.

如果它有帮助,这里是gcc 5.1(tnx godbolt)的错误和警告

!!错误:缩小'258ul'从'size_t {aka long unsigned int}'到'char'的转换{}


!!警告:缩小'sz'从'size_t {aka long unsigned int}'转换为'char'的内部{} [-Wnarrowing]

好人铿锵3.6在这两种情况下都给出了错误,但问题仍然存在,是一个合法而糟糕的C++和其他非法C++?

c++ gcc clang language-lawyer c++11

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

numeric_limits 对引用类型不起作用是否有原因?

如果您错误地执行以下操作:

#include<limits>
int arr[3];
auto x  = std::numeric_limits<decltype(arr[0])>::max();
Run Code Online (Sandbox Code Playgroud)

您将从 STL 实现中的文件中获得无用的错误消息。

问题是模板参数是一个引用,所以修复是删除它:

auto x  = std::numeric_limits<std::remove_reference_t<decltype(arr[0])>>::max();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是为什么numeric_limits不知道自己做这个?我明白,你不想删除pointerness(因为maxchar指针maxchar是非常非常不同的东西),但我认为,只要你有一个参考作为参数传递给numeric_limits你非常乐意与被删除它得到的结果.

c++ templates numeric-limits

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

我可以通过管道传输到 range-v3 累积吗?

我发现 3 年前的旧问题说一般来说这是不可能的,但我真的很想累积,因为在某些情况下它非常好,例如:

const double val = data | transform(...) | accumulate (...);
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否在 range-v3/C++20 范围中添加了一些东西,使我能够做到这一点。

c++ range-v3 c++20

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

类型特征可以限制为不接受其他类型特征作为参数吗?

问题可能很奇怪,所以这里是一个简短的激励示例:

#include <vector>
#include <type_traits>
template <typename T>
// workaround for gcc 8.3 where volatile int is not trivially copyable
using is_tc = std::is_trivially_copyable<std::remove_cv<T>>;
// static assert passes compile, oops
static_assert(is_tc<std::vector<int>>::value);
Run Code Online (Sandbox Code Playgroud)

如您所见,错误在于我将类型特征本身传递给另一个类型特征,而不是传递::type或使用std::remove_cv_t.

明显的解决方案是我不要犯错误,但我想知道 C++ 类型特征是否可以限制它们的输入类型,以便它们不接受其他 type_traits 作为参数。现在困难的是 type_traits 中有大量类型特征,所以 IDK 如何最好地实现这一点。

注意:我不是说 C++ 应该这样做,我知道要防止罕见的错误需要做很多工作,我只是想了解更复杂的概念设计,其中您的限制不基于类型的语义(又名具有 ++和 *) 但事实上类型属于一个庞大的类型集(并且该集包括您限制的类型)。

c++ type-traits c++-concepts c++20

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

当缓存行大小通常为 64 字节时,为什么 sizeof std::mutex == 40

在 static_assert 之后,gcc 和 clang 主干都通过了。

#include<mutex>
int main(){
    static_assert(sizeof(std::mutex)==40);
}
Run Code Online (Sandbox Code Playgroud)

由于 x86 CPU 有 64 字节缓存线,我期望互斥锁 sizeof 为 64,因此可以避免错误共享。大小“仅”40 字节是否有原因?

注意:我知道大小也会影响性能,但程序中很少有大量互斥体,因此与错误共享的成本相比,大小开销似乎可以忽略不计。

注意:有一个类似的问题问为什么 std::mutex 这么大,我问为什么它这么小:)

编辑:MSVC 16.7 的大小为 80。

c++ optimization x86 false-sharing stdmutex

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

我可以让 lambda 推导出变体返回类型吗?

这主要是理论上的,因为我总是可以拼出返回类型,但我想知道是否有办法告诉 lambda 返回类型应该是 lambda 主体中所有返回的 union(std::variant) 。

#include <iostream>
#include <variant>

struct A{
    int val = 47;
};

struct B {
    float val = 4.7;
};

int main()
{
    for (int i=0;i<8;++i){
                      // can this be something like -> auto_variant  (auto_variant is some library type)
        auto var = []()->std::variant<A, B> {
            if (rand()%2 ){
                return A{};
            } else {
                return B{};
            }
        }();
        std::visit ([](const auto& val) {std::cout<< val.val << std::endl;}, var);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我强烈的感觉是答案是否定的,这是不可能的,但我很好奇是否有人知道一些技巧。

注意2:使用 std::any 不符合我的要求,因为我希望在编译时知道 lambda 的返回类型,而不是在运行时(使用 …

c++ lambda c++20 std-variant

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

为什么C++20知道如何散列string_view,但不知道如何散列span&lt;char&gt;?

我最好的猜测是,委员会要么忘记了这个用例,要么不想使用概念/要求将类型限制span为可以安全散列的东西(POD,无填充),或者他们不想要半解决方案(等待反射) )...

如果有人对这里感兴趣,可以使用带有无用错误消息和代码的godbolt链接,但我认为我的问题很清楚,没有任何代码。

#include <span>
#include <unordered_set>
#include <string_view>
int main() {
    std::hash<std::string_view> h1;
    std::hash<std::span<char>> h2; // error here
}
Run Code Online (Sandbox Code Playgroud)

注意:我知道 C++std::库在哈希方面缺乏,例如它不能哈希std::pair<int,int>,但我的问题特别是关于std::span.

c++ string-view c++20 std-span

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