小编old*_*987的帖子

如果constexpr和C4702(以及C4100和C4715)

有没有办法解决以下问题:

此代码生成C4702警告"无法访问代码"(在VC++ 15.8上/std:c++17)

template <typename T, typename VariantType>
inline bool MatchMonostate( VariantType& variant )
{
    SUPPRESS_C4100( variant );
    if constexpr ( std::is_same_v<T, std::monostate> )
    {
        variant = std::monostate();
        return true;
    }
    return false;  // !!! unreachable if the above is true !!! => C4702
}
Run Code Online (Sandbox Code Playgroud)

为了抑制C4100'未引用的形式参数'警告,我已经在使用这个技巧了

#define SUPPRESS_C4100(x) ((void)x)
Run Code Online (Sandbox Code Playgroud)

添加的简单想法

    else
    {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

导致警告C4715'并非所有控制路径都返回值'.

c++ visual-c++ c++17 if-constexpr

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

仅头文件库的配置 (C++)

我正在用 C++ 编写一个仅包含头文件的库。使事情尽可能简单,用户只需#include mylib.h

在某些情况下,(高级)用户可能想要配置库的行为(例如错误处理、编译时或运行时检查、调试输出以及可能的其他内容)

请不要告诉我执行此操作的最佳方法(甚至标准方法),因为否则问题将被搁置!

现在,我有一个文件“config.h”作为我的库的一部分,其中包含相关内容,#define MYLIB_XYZs但我意识到这完全是无稽之谈,因为用户需要修改库本身才能进行配置。

c++ config configuration-files header-files lib

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

constexpr在函数调用中不起作用/应用

我已经实现了一个constexpr编译时哈希函数,如果被调用,它可以正常工作(即在编译时进行评估)

constexpr auto hash = CompileTimeHash( "aha" );
Run Code Online (Sandbox Code Playgroud)

但是我需要在实际代码中使用它作为函数的参数

foo( CompileTimeHash( "aha" ) ); // foo is NOT constexpr
Run Code Online (Sandbox Code Playgroud)

由于某个特定原因,我不能使用长版本

constexpr auto hash = CompileTimeHash( "aha" );
foo( hash );
Run Code Online (Sandbox Code Playgroud)

编译器(VC++)在短(第一)情况下不会编译时哈希.有没有办法实现这个目标?

编辑:现在可以找到一个覆盖3个案例的例子:https: //godbolt.org/z/JGAyuE 只有gcc在所有3个案例中完成它

c++ compile-time-constant compile-time constexpr c++17

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