所以我有一个在GCC中运行良好的宏,但在微软的C++编译器中没有.我希望有人可能知道一种解决方法,或者也许可以向我解释它为什么会这样.
我确定这个宏并不完全是"标准",但它确实会帮助我.
这是宏的一个功能示例:
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)
#define FULLY_EXPANDED(count, ...) \
MAC ## count (__VA_ARGS__)
#define SEMI_EXPANDED(count, ...) FULLY_EXPANDED(count, __VA_ARGS__)
#define EXPAND_THESE(...) SEMI_EXPANDED(VA_NARGS(__VA_ARGS__), __VA_ARGS__)
#define ACTUAL_MACRO(x) parent->GetProperty<x>();
#define MAC1(a) ACTUAL_MACRO(a)
#define MAC2(a,b) MAC1(a) ACTUAL_MACRO(b)
#define MAC3(a,b,c) MAC2(a,b) ACTUAL_MACRO(c)
#define MAC4(a,b,c,d) MAC3(a,b,c) ACTUAL_MACRO(d)
#define MAC5(a,b,c,d,e) MAC4(a,b,c,d) ACTUAL_MACRO(e)
Run Code Online (Sandbox Code Playgroud)
以下是我如何使用此宏:
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
Run Code Online (Sandbox Code Playgroud)
以下是GCC如何扩展上述内容:
struct MyStructure
{
void …Run Code Online (Sandbox Code Playgroud) 所以我有一个数组(0 - n),保存我希望std :: set用于它的排序的值.数组是unsigned int cost [n].
我正在使用以下仿函数进行此排序:
struct ProxySorter {
ProxySorter(const unsigned* arr) : proxy_array(arr) {}
bool operator()(const unsigned& a, const unsigned& b) const {
return proxy_array[a] < proxy_array[b];
}
const unsigned* proxy_array;
};
Run Code Online (Sandbox Code Playgroud)
所以这就是问题......当我构建集合时,这是合法的:
std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)
我没有错误,一切都按预期工作.但这似乎是黑客和草率.
但是,这显然是非法的:
std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)
试图用ProxySorter(成本)构造它会导致一堆错误,为每个set成员调用说这样的东西:
错误:在node_queue中请求成员擦除,这是非类型类型std :: set <unsigned int,ProxySorter>(ProxySorter)
常规施工有什么问题?为什么作业有效?我错过了什么区别?任何帮助非常感谢,谢谢.
哦,抱歉问题的标题,我不知道该怎么称呼它.
首先,澄清一点,我不是问如何将文件拖放到exe的图标上.我想知道如何处理拖放到已经运行的 win32控制台应用程序.我也没有问如何通过Windows消息泵处理基于WinMain的应用程序内部的拖放.我想在一个程序中使用入口点int main()没有WndProc(尚未)或任何东西.
那就是说,我想知道我的目标是否可以实现(并希望它是).
我有一个在控制台窗口中运行的服务器应用程序.由于代码库很大并且有许多奇怪的耦合,它是一个"仅输出"控制台,适用于所有密集目的.尽管如此,我仍然可以处理按键等操作,因为我有更新循环滴答声.我希望能够将完整命令(使用自定义语法)的文件拖放到我正在运行的应用程序中并让它处理它们.
这可能吗?我在想,我可能会得到一个指向控制台HWND的指针(希望这是一个东西?),然后可能将该窗口子类化为使用自定义WndProc来监听WM_DROPFILES消息.
我从来没有真正尝试在int main()程序中设置windows消息的处理而不是WinMain程序,但我希望它在某种程度上可行.
任何帮助将不胜感激! 奇怪的解决方案很好.