小编Fel*_*bek的帖子

为什么C++不允许用户定义的运算符?

我一直想知道这件事已经有一段时间了.已经有很多它们可以超载,那么为什么不到最后并允许自定义运营商呢?我认为这可能是一个很好的补充.

我被告知这会使语言难以编译.这让我想知道,C++无法真正设计为易于编译,所以它真的可以撤销吗?当然,如果你使用带有静态表和语法的LR解析器,例如

E ? T + E | T
T ? F * T | F
F ? id | '(' E ')'
Run Code Online (Sandbox Code Playgroud)

它不会起作用.在Prolog中,通常使用运算符优先级解析器AFAIK进行解析,可以轻松定义新的运算符,但语言更简单.现在,语法显然可以被重写为接受identifiers在操作符被硬编码到语法中的每个地方.

还有哪些其他解决方案和解析器方案以及其他哪些因素影响了设计决策?

c++ parsing operators

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

是否有更短的方式编写`StringPtr?StringPtr:"null"`?

我有这个代码:

 std::wstringstream outstream;
 outstream << (prop.m_pwszOriginalVolumeName 
             ? prop.m_pwszOriginalVolumeName 
             : L"null") << L";"
           << (prop.m_pwszSnapshotDeviceObject 
             ? prop.m_pwszSnapshotDeviceObject 
             : L"null") << L";"
           << (prop.m_pwszOriginatingMachine 
             ? prop.m_pwszOriginatingMachine
             : L"null") << L";"
           << ... // some more strings here
Run Code Online (Sandbox Code Playgroud)

有没有办法避免代码重复,仍然有简洁的代码?

c++ conditional-operator

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

C++ 将选项(的子集)传递给函数的优雅方式

我有一个函数,它的确切行为由一组标志控制。其中大部分通常是错误的。将它们全部作为参数很快就会变得非常混乱。

我可以为标志创建一个枚举:

enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 };
PExpression ParseExpr(unsigned int flags);
Run Code Online (Sandbox Code Playgroud)

好一点:现在,在调用函数时,我只需指定要设置的值,而不是一长串bools。

但是,我想知道是否有更优雅或更通用的方法将选项子集传递给函数。如果我有非布尔选项怎么办?

我正在寻找一种 C++(Boost 可以)方式来调用如下函数:

ParseExpr({ isConst: true; maxDepth: 5 });
Run Code Online (Sandbox Code Playgroud)

我可以省略我想保留默认值的所有值。

为此存在哪些技术和/或库?

c++ flags parameter-passing pass-by-name

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

为什么我的C++ ATL项目链接在CIL库中?

我从VC++ 2013收到此链接器错误:

1>* CIL library *(* CIL module *) : 
error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodul.obj)
Run Code Online (Sandbox Code Playgroud)

这是一个纯C++项目,包含"ATL简单对象"的COM DLL,以及在常规项目设置中选择"无公共语言运行时支持" .我只是向导创建它,它具有与其他工作COM DLL相同的设置.

我需要链接MFC库,而不是.NET相关的库.这个CIL库怎么可能最终在构建中?

c++ mfc cil visual-c++ visual-studio-2013

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

stringbuf / ifstream 的 C++ 编译器错误

我不明白为什么我的编译器 (MSVC++2010) 不喜欢这个代码:

    // get_sum(filename as c-string) returns sum from file
    int get_sum(const char* const s) {
        stringbuf bill_buf;
        ifstream bill_file;
        bill_file.open(s);
        bill_file.get(bill_buf, '\0');  // read whole file
        bill_file.close();
        return get_sum_from_string(bill_buf.str());
}
Run Code Online (Sandbox Code Playgroud)

我收到这些错误(我将它们从德语翻译成英语,并为代码摘录提供了正确的行号,而没有前导注释):

  1. 错误 1 ​​错误 C2079:'bill_buf' 使用未定义的类 'std::basic_stringbuf<_Elem,_Traits,_Alloc>'(第 2 行)

  2. 错误 2 错误 C2664:“std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::get(_Elem *,std::streamsize)”:将参数 1 从“int”转换为“char *” ' 不可能(第 5 行)

  3. 错误 3 错误 C2228:“.str”的左侧必须有一个类/结构/联合。(第 7 行)

有没有人知道那里发生了什么?非常感谢!(如果有人更好地了解如何快速将整个文件内容转换为字符串,我也将不胜感激)

c++ file-io compiler-errors

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

在VB6中使用C++ DLL

我刚刚在MSVC++ 2010中为我的老板创建了一个DLL.我选择"新Win32 DLL"选项"导出符号",所以,一切都是完全标准的.新项目文件中有一些预定义的导出,一个类,它的构造函数,一个带有伪值的全局函数和变量,以及一个带有APIENTRY函数的文件dllmain.cpp.我什么都没改变.

现在我的老板想在他的VB6项目中使用导出的东西.他开始了一个VB6项目,做了菜单"Project" - "Links"(从德语翻译成英语,所以它可能有所不同,但我确定你知道我的意思)并选择了一个DLL文件,正如他所说的那样通常会.

但是,VB6无法包含它,而是显示错误消息"无法包含DLL文件"(没有给出真正的理由).Visual C++ 6中标准的新DLL项目也是如此.我的老板认为这可能是因为符号没有真正导出或者VB6需要一些特殊的声明.有谁知道问题是什么?

c++ vb6 dll dllexport

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

避免在map/unordered_map中进行多次查找

假设我们有一个昂贵的函数映射stringint并希望将结果缓存在地图中.

最简单的代码就是

int mapStringToIntWithCache(std::string const& s) {
    static std::unordered_map<std::string, int> cache;
    if (cache.count(s) > 0) return cache[s];
    else return cache[s] = myExpensiveFunction(s);
}
Run Code Online (Sandbox Code Playgroud)

但这有2次查找.

因此,我倾向于写这个

int mapStringToIntWithCache(std::string const& s) {
    static std::unordered_map<std::string, int> cache;
    size_t sizeBefore = cache.size();
    int& val = cache[s];
    if (cache.size() > sizeBefore) val = myExpensiveFunction(s);
    return val;
}
Run Code Online (Sandbox Code Playgroud)

这只有一个查找,但似乎有点笨拙.有没有更好的办法?

c++ performance dictionary stdmap

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

C ++ 20 constexpr容器将如何工作?

作为constexpr std::stringconstexpr std::vector已被接受为C ++ 20,如何将这些被使用?链接的文件在细节上很短。我们是否需要指定特殊的constexpr分配器,使编译时字符串/向量与其常规等效项不兼容?

c++ containers stl constexpr c++20

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

有没有更好的方法在 C++ 20 之前的 C++ 中定义关系运算符?

写代码对我来说很乏味

class date {
private: 
    int day, year, month;
    int comp(const date & Other) const;
public:
    date(int D, int Y, int M) : day (D), year (Y), month (M)  {}

    friend bool operator==(const date & L, const date & R) { return L.comp(R) == 0 ; }
    friend bool operator!=(const date & L, const date & R) { return L.comp(R) != 0 ; }
    friend bool operator> (const date & L, const date & R) { return L.comp(R) > 0 …
Run Code Online (Sandbox Code Playgroud)

c++ operators comparison-operators c++17

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

我可以在 VS Code difftool 模式下突出显示字符吗?

当 VS Code 用作比较工具时,例如使用git difftool,它会以红色和绿色显示更改的行。有没有办法突出显示更改的字符(除了线条之外或代替线条)以使它们更加突出?

difftool visual-studio-code

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