假设我们有
template<typename T>
struct Foo
{
};
template<typename T>
struct Bar
{
};
template< template<typename T> class C >
struct Pack
{
template<typename T>
using Container = C<T>;
};
Run Code Online (Sandbox Code Playgroud)
正在Foo和Pack<Foo>::Container应该,如果我们有一个专门被当作一回事Foo?那是:
template< template<typename T> class C >
struct IsFoo : std::false_type
{
};
template<>
struct IsFoo<Foo> : std::true_type
{
};
static_assert( IsFoo<Foo>::value, "Only foos!" );
static_assert( IsFoo< Pack<Foo>::Container >::value, "Only foos!" ); // ???
static_assert( IsFoo< Pack<Bar>::Container >::value == false, "Not a foo!" );
Run Code Online (Sandbox Code Playgroud)
第二个断言是否正确?预期的行为是什么?哎呀,我正在努力做甚至有效吗? …
我在使用该功能时遇到问题SHAutoComplete.当我在父窗口不是对话框的编辑框中使用它时,它无法正常工作.
自动完成功能似乎工作正常,但下拉列表与基于编辑框中键入的内容的可能候选项的呈现非常混乱.基本上只显示下拉菜单的边框.边框的宽度足以满足可能的建议,但建议本身从未被绘制.即使是下拉列表背景颜色也是错误的.就好像它从未被绘制过并保持原始父窗口颜色.
如果建议的数量足够大,因此下拉列表需要滚动条,滚动条也无法正确呈现 - 箭头不会被绘制.
在这两种情况下,无论是否有滚动条,下拉列表都不接受鼠标输入,即我无法点击这些项目.如果我在显示下拉菜单时按下键盘上的"向下"键,它会按预期工作.在第二次或第三次按下后,项目最终开始出现.但滚动条仍然无法正确呈现.
如果不是注册我自己的Windows类,我只需使用一个对话框::DialogBoxParam(),然后一切按预期进行.自动完成工作完全没有任何问题.
这就是我在做的事情.此代码将注册一个窗口类,创建主窗口,创建一个编辑框,然后调用SHAutoComplete它.它必须与之相关联Shlwapi.lib
// this code must be linked with Shlwapi.lib
#include <Windows.h>
#include <Shlwapi.h>
// name of the class that will be created for the main window
static const char WindowClassName[] = "SHAutoCompleteDoesNotWorkWithoutADialogWindowClassName";
// the main window procedure
static LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
HWND hwndEdit = ::CreateWindowEx(
0,
"EDIT",
0,
WS_CHILD | WS_VISIBLE,
10, …Run Code Online (Sandbox Code Playgroud)