我使用一对整数模板参数来指定比率,因为我不能使用double作为模板参数.转换为双精度可以防止零三进制.这在早期版本的编译器中有效,但Visual Studio 2013出现错误:
error C2124: divide or mod by zero
Run Code Online (Sandbox Code Playgroud)
这是代码的简化版本:
template<int B1, int B2>
class MyClass
{
const double B = (B2 == 0) ? 0.0 : (double) B1 / (double) B2;
// ...
};
MyClass<0, 0> myobj;
Run Code Online (Sandbox Code Playgroud)
我真的希望B在零时使用它的表达式进行优化,所以我需要单行定义.我知道我可以使用模板参数<0, 1>来解决它,但我想知道是否有办法说服编译器我的表达式是安全的?
类ID(GUID)通常用由破折号分隔的十六进制数字序列指定,例如{557cf406-1a04-11d3-9a73-0000f81ef32e}.这不是可用于直接初始化CLSID结构的文字.
我发现了两种初始化结构的方法,但它们都很尴尬.第一个不允许声明它const,必须在运行时完成,而第二个需要大量重新格式化十六进制常量.
CLSID clsid1;
CLSIDFromString(CComBSTR("{557cf406-1a04-11d3-9a73-0000f81ef32e}"), &clsid1);
const CLSID clsid2 = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e } };
Run Code Online (Sandbox Code Playgroud)
我知道如果你有一个与UUID相关联的类型,Visual Studio可以使用__uuidof运算符自动生成一个.如果你只有十六进制字符串,有没有办法做到这一点?
GDI + Image::Save方法需要CLSID参数来指定要使用的编码器.该文档指向一些示例代码,用于获取与特定MIME类型相关联的编码器,例如image/jpeg或image/png.但是我想到复制一个半页函数只是为了支持一行调试辅助,我将中间结果保存到磁盘.
不应该有标准编码器的标准CLSID列表吗?我在哪里可以找到这样的清单?我无法通过搜索Microsoft的包含文件找到一个.
我正在尝试插入现有vector元素的副本以使其加倍.以下代码在以前的版本中有效,但在Visual Studio 2010中失败.
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.insert(test.begin(), test[0]);
cout << test[0] << " " << test[1] << " " << test[2] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
-17891602 1 2预期产出1 1 2.
我已经弄清楚它为什么会发生 - 向量被重新分配,并且引用在被复制到插入点之前变为无效.较旧的Visual Studio显然以不同的顺序执行操作,从而证明未定义行为的一个可能结果是正确工作并且证明它永远不是您应该依赖的东西.
我想出了两种不同的方法来解决这个问题.一种方法是reserve确保不进行重新分配:
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
Run Code Online (Sandbox Code Playgroud)
另一种是从引用中复制,以便不依赖于引用的剩余有效:
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
Run Code Online (Sandbox Code Playgroud)
虽然两者都有效,但两者都不是一种天生的解决方案.有什么我想念的吗?
Python是否提供了一个函数来获取通过递增现有浮点值的最低有效位而得到的浮点值?
我正在寻找类似于std::nextafterC++ 11中添加的功能的东西.
Python有许多方法可以生成不同的随机数分布,请参阅模块的文档random.不幸的是,没有适当的数学背景,它们并不是非常容易理解,特别是考虑到所需的参数.
我想知道这些方法中是否有任何一种能够产生符合Benford定律的分布的随机数,以及哪些参数值是合适的.即对于整数群体,那些整数应该在大约30%的时间以'1'开头,'2'在大约18%的时间开始,等等.
def benfords_range_gen(stop, n):
""" A generator that returns n random integers
between 1 and stop-1 and whose distribution
meets Benford's Law i.e. is logarithmic.
"""
multiplier = math.log(stop)
for i in range(n):
yield int(math.exp(multiplier * random.random()))
>>> from collections import Counter
>>> Counter(str(i)[0] for i in benfords_range_gen(10000, 1000000))
Counter({'1': 300696, '2': 176142, '3': 124577, '4': 96756, '5': 79260, '6': 67413, '7': 58052, '8': 51308, '9': 45796})
Run Code Online (Sandbox Code Playgroud) 如果使用初始化列表创建a struct,那么您忽略的成员是否会获得已知的默认值?
public struct Testing
{
public int i;
public double d;
public string s;
}
Testing test = new Testing { s="hello" };
Run Code Online (Sandbox Code Playgroud)
我发现微软的链接暗示了它,但没有明确说明:默认值表(C#参考).
一个小的测试程序显示它不会生成编译器错误并产生预期的结果.我知道最好不要依靠简单的测试来保证.http://ideone.com/nqFBIZ
请注意,这与关于gcc的StackOverflow上的许多问题不重复,我正在使用Visual Studio 2013.
这个简单的正则表达式构造抛出std::regex_error:
bool caseInsensitive = true;
char pattern[] = "\\bword\\b";
std::regex re(pattern, std::regex_constants::ECMAScript | (caseInsensitive ? std::regex_constants::icase : 0));
Run Code Online (Sandbox Code Playgroud)
what异常对象返回的实际错误不一致.通常它是一个不匹配的parethesis或支撑.为什么?
我一直认为创建一个新对象总是会调用一个对象的默认构造函数,而构造函数是显式的还是由编译器自动生成的没有区别.根据对这个不同问题的高度重视的答案,这在C++ 98和C++ 03之间以微妙的方式发生了变化,现在的工作原理如下:
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
new B; // default-initializes (leaves B::m uninitialized)
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我: