是否可以在"现代C++"(C++ 17或更高版本)中将字符串文字作为参数传递给C++模板?
我意识到你可以用构造函数参数做到这一点; 我只是认为将它作为模板参数更方便,而不是深埋在cpp文件中.如果这可能是现代C++的一个新功能,我很好奇.请参阅下面的伪代码我正在尝试做的事情:
伪代码示例:
// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
ModuleBase();
string name;
};
class xyz : ModuleBase<"xyz"> {
public:
xyz();
};
// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
name = Name;
}
xyz::xyz() : ModuleBase() {
}
Run Code Online (Sandbox Code Playgroud) #include <iostream>
#include <type_traits>
void func()
{
}
int main()
{
using T = const decltype(func) &;
using T2 = void (&)();
std::cout << std::boolalpha << std::is_same_v<T, T2> << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
你如何声明const reference一个函数类型?上面的语句打印true所以我假设constin T以某种方式被忽略.是否有可能const reference将a 声明为函数类型?
题
可以在编辑器窗口中配置QtCreator隐藏警告,同时仍然在左侧显示警告图标吗?
描述
启用了Clang Code Model的QtCreator 4.5在2个位置显示警告:
在我看来,前者混乱的GUI和后者既充足又不那么具有侵入性.
我查看了QtCreator选项,包括代码模型选项,但找不到任何设置.
std::locale使用空字符串进行构造以使用户首选的本地语言环境成为标准的一部分吗?如果是,您是否可以指出明确指出这一点的来源?
文档的示例std::locale包含以下内容:
std::wcout << "User-preferred locale setting is " << std::locale("").name().c_str()
Run Code Online (Sandbox Code Playgroud)
这暗示用空字符串创建语言环境将返回用户首选的本机语言环境。快速浏览后,本文还提到:
空字符串告诉setlocale使用用户在环境中指定的语言环境。
但是,在查看有关构造函数的文档std::locale时,当提供空字符串时,没有提及特殊情况。
这是报价:
3-4)构造具有指定std_name的系统语言环境的副本(例如“ C”,“ POSIX”,“ en_US.UTF-8”或“ English_US.1251”),如果该语言环境受支持的话。操作系统。以这种方式构造的语言环境具有名称。
一些背景:
扩展namespace std是未定义的行为(UB),除非它是模板特化[ 1 ]:
将声明或定义添加到命名空间std或嵌套在std中的任何命名空间是未定义的行为,下面列出了一些例外情况
我们boost::tr1在没有tr1支持的平台上使用(例如,WinCE,WM).Boost就是这样做的:将自己的实现注入std::tr1if tr1中.
namespace std{ namespace tr1{
using ::boost::bad_weak_ptr;
using ::boost::shared_ptr;
...
} }
Run Code Online (Sandbox Code Playgroud)
我的问题是:
这是否意味着如果boost::tr1与非tr1编译器一起使用它是UB ?
或者,std只要开发人员确保反向移植的功能不可用,是否可以注入反向移动?
如果它是好的,可以在一个把它一步,注入boost::tr1到std代替std::tr1?
给定
template <typename T>
struct Vector3d { T x, y, z; };
Run Code Online (Sandbox Code Playgroud)
是否可以安全地假设x,y和z位于连续的内存位置中?
假设for T = float和至少安全T = double吗?
如果不是,是否可以跨平台执行?
注意:只要x,y,z是连续的,我就不介意在z之后填充
这段代码
#include <iostream>
#include <map>
int main()
{
std::map<int, std::size_t> m;
m[0] = m.size();
std::cout << m[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
1。vc++ 的结局如何0?是否有一种干净的方法或解决方法来实现一个可以兼容的抛出析构函数c++98和c++1x编译器,它们是跨平台的并且不会产生警告?
有一个表示错误代码的遗留类,如果未处理则抛出该错误代码.为此,它使用了一个抛出析构函数.
一个跨平台(g ++,VC++)实现,可以编译和使用两个较旧的c++98编译器(感谢MS for WindowsCE)以及编译器支持c++1x.理想情况下,它不应该产生任何警告.
问题是因为c++11默认情况下所有析构函数都是非抛出的(如果抛出异常,将在运行时终止).解决方法是noexcept(false),但它不可用c++98.另一方面c++98有异常规范,通常被认为是坏的并且因为c++11Eg 而被弃用,请参阅:为什么异常规范不好?.
class ThrowingErrorCode
{
public:
...
// silence the VC exception specification warning
// we need to use exception specification for a throwing destructor, so that it would compile with both c++98 and c++11
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable : 4290 )
#endif
~ThrowingErrorCode() throw(ErrorCodeException) …Run Code Online (Sandbox Code Playgroud) 我的代码:
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_settop(L, 0);
//Script A
luaL_dostring(L, "A = {} A.num = 3");
//Script B
luaL_dostring(L, "B = {} function B.update() return A.num * 2 end");
//Script C
luaL_dostring(L, "print(B.update())");
lua_close(L);
Run Code Online (Sandbox Code Playgroud)
结果: 6
但是,如果我像下面这样制作表A和B本地:
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_settop(L, 0);
//Script A
luaL_dostring(L, "local A = {} A.num = 3");
//Script B
luaL_dostring(L, "local B = {} function B.update() return A.num * 2 end");
//Script C
luaL_dostring(L, "print(B.update())");
lua_close(L);
Run Code Online (Sandbox Code Playgroud)
它不输出任何东西.
如何使第二个代码工作,两者之间更有推荐的设计? …