假设我们有一个班级
template <int(*F)(int, int)>
class A {
// ...
};
Run Code Online (Sandbox Code Playgroud)
它需要一个函数作为模板参数.
现在我想制作一个可变参数模板,它将函数作为模板参数.
template <int(*F...)(int, int)> // this won't compile
template <int(*F)(int, int)...> // this won't compile either
Run Code Online (Sandbox Code Playgroud)
怎么做得好?
我首先要提到的是,以下工作正常到Qt 5.0.0 beta 1(也许是beta 2和RC也不知道),但在Qt 5.0.0最终版本中失败了.我只想参考Qt 5.0.0最终版本中看到的结果.所以很可能这与Qt5最近的变化有关.
在C++方面,我在命名空间中有一组类(QObject派生)(可选地用编译器标志触发;类在一个单独的库中,并且库将命名空间的使用作为选项留给用户使用图书馆).这里的一个类Game
可能看起来像这样(摘录):
OAE_BEGIN_NAMESPACE
// forward-declarations:
class Player; // Player is just another class in the same library
class Game : public QObject
{
Q_OBJECT
public:
explicit Game(...);
public slots:
Player *player() const; // <-- the quesion is about such slots
};
OAE_END_NAMESPACE
Run Code Online (Sandbox Code Playgroud)
这些宏OAE_BEGIN/END_NAMESPACE
扩展为namespace OAE_NAMESPACE {
...... }
或者没有,就像Qt所做的那样<qglobal.h>
,只是在宏名称中用"OAE"替换"QT":
#ifndef OAE_NAMESPACE
# define OAE_PREPEND_NAMESPACE(name) ::name
# define OAE_USE_NAMESPACE
# define OAE_BEGIN_NAMESPACE
# define OAE_END_NAMESPACE
# define OAE_BEGIN_INCLUDE_NAMESPACE
# …
Run Code Online (Sandbox Code Playgroud) 我对以下元组业务感到有些困惑:
int testint = 1;
float testfloat = .1f;
std::tie( testint, testfloat ) = std::make_tuple( testint, testfloat );
std::tuple<int&, float&> test = std::make_tuple( testint, testfloat );
Run Code Online (Sandbox Code Playgroud)
有了std::tie
它的工作原理,而是直接引用不编译的元组分配,使
"错误:从'std :: tuple <int,float>'转换为非标量类型'std :: tuple <int&,float&>'required"
要么
"没有合适的用户定义的转换,从std :: tuple <int,float>到std :: tuple <int&,float&>"
为什么?我仔细检查了编译器是否真的与通过执行此操作分配的类型相同:
static_assert( std::is_same<decltype( std::tie( testint, testfloat ) ), std::tuple<int&, float&>>::value, "??" );
Run Code Online (Sandbox Code Playgroud)
评估为真.
我也在线查看是否可能是msvc的错误,但是所有编译器都给出了相同的结果.
我正在尝试解决以下问题:
将M*N的矩形纸张切割成正方形,使得:
- 沿着与纸张的一侧平行的线切割纸张.
- 切割纸张使得所得尺寸总是整数.
当纸张无法进一步切割时,该过程停止.
切割的纸张最小数量是多少都是正方形?
限制:1 <= N <= 100且1 <= M <= 100.
示例:设N = 1且M = 2,则答案为2,因为可以切割的最小平方数为2(纸张沿中间的较小边水平切割).
我的代码:
cin >> n >> m;
int N = min(n,m);
int M = max(n,m);
int ans = 0;
while (N != M) {
ans++;
int x = M - N;
int y = N;
M = max(x, y);
N = min(x, y);
}
if (N == M && M != 0)
ans++;
Run Code Online (Sandbox Code Playgroud)
但我没有弄到这种方法有什么问题,因为它给了我一个错误的答案.
我有一个包含C#和托管C++项目的解决方案.它在解决方案平台x64和x86中编译.由于它是托管C++,我想创建一个'Any CPU'解决方案并摆脱旧的解决方案.
我将C++项目链接器设置更改为x64和x86的强制安全IL映像.
接下来,使用Configuration Manager,我创建了一个名为"Any CPU"的新解决方案平台.接下来我添加了一个名为"Any CPU"的项目平台.
我继续将所有C#项目设置为"任何CPU",但对于C++我不能这样做.项目平台'Any CPU'不在下拉列表中,也没有选项'New ...'.
VS是关于它的,所以我保持它就像它并开始构建.令我惊讶的是,结果DLL(来自C++项目)是MSIL,即使C++的平台是x64.编译x32时也是如此,生成的DLL在MSIL中.
是什么赋予了?为什么我不能将C++项目设置为"任何CPU"?
我有一个自定义QTextEdit
小部件,它在角落里有自己的调整大小.我可以很好地调整文本小部件的大小,但是它内部的布局不会随着文本编辑的大小调整而改变.
有没有办法告诉管理布局根据其中一个小部件的独立大小变化重新计算自己?
我需要从unicode charcode中获取字符串/ char,最后将其放入DOM TextNode中,以使用客户端JavaScript添加到HTML页面中.
目前,我正在做:
String.fromCharCode(parseInt(charcode, 16));
Run Code Online (Sandbox Code Playgroud)
其中charcode
是包含charcode的十六进制字符串,例如"1D400"
.应该返回的unicode字符是, but a
?
返回了!按预期返回16位范围(0000
... FFFF
)中的字符.
有任何解释和/或修改建议吗?
提前致谢!
是否有可用于Windows的独立VC++编译器?甚至CLI编译器都可以.
由于我在Virtualbox中使用Windows,因为内存不足,Visual Studio非常慢.
我有一个ScopedLock
类可以帮助在超出范围时自动释放锁定.但问题是:有时团队成员会编写无效的锁码,例如
{
ScopedLock(mutex); // anonymous
xxx;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是错误的,因为ScopedLock
对象是立即构造和销毁的,因此无法锁定预期的区域(xxx
).我希望编译器在尝试编译此类代码时出错.可以这样做吗?
我搜索了g++
警告选项,但找不到合适的警告选项.
为什么std::pair<A,B>
不一样std::tuple<A,B>
?不能用另一个替换一个人总是感到奇怪.它们有点可兑换,但也有局限性.
我知道,std::pair<A,B>
需要有两个数据成员A first
和B second
,因此它不能仅仅是一个类型别名std::tuple<A,B>
.但是我的直觉说我们可以专门化std::tuple<A,B>
,这是一个具有两个元素的元组,等于标准要求的定义std::pair
.然后别名这个std::pair
.
我想这是不可能的,因为它太过直接而不被人们想到了,但它没有在g ++的libstdc ++中完成(例如我没有查看其他库的源代码).这个定义的问题是什么?它是否"会"破坏标准库的二进制兼容性?