我有一个类,其模板接受一个整数:
template <unsigned int N>
class Example {};
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来定义一个(成员)函数,它接受一些Example对象作为参数.金额将由N,确定,因此函数将使用如下:
Function(Example<2>(), Example<2>());
Function(Example<3>(), Example<3>(), Example<3>());
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试了什么:
使用初始化列表,可以将一组对象传递给函数:
template <unsigned int N>
void Function(std::initializer_list<Example<N>> list);
//...
Function({Example<2>(), Example<2>()});
Run Code Online (Sandbox Code Playgroud)
但是,除了真正只传递一个参数(列表)之外的问题是,使用此方法可以使用任意数量的参数:
Function({Example<2>()});
Run Code Online (Sandbox Code Playgroud)
我也尝试使用可变参数函数:
template <unsigned int N>
void Function(Example<N> e...)
{
va_list args;
va_start(args, e);
//...
}
Function(Example<2>(), Example<2>());
Run Code Online (Sandbox Code Playgroud)
这使得可以使用真实参数,但仍然存在使用任意数量参数的问题,并且不可能知道实际传递了多少参数.
我有一个头文件(让我们称之为Window.h),有点像这样:
#include <windows.h>
class Window {
Window();
HWND hwnd;
}
Run Code Online (Sandbox Code Playgroud)
要在另一个文件(例如Main.cpp)中使用此类,必须包含Window.h:
#include "Window.h"
Run Code Online (Sandbox Code Playgroud)
问题是我不希望Main.cpp包含windows.h,因为windows.h在命名空间之外添加了许多我不想在Main.cpp中的宏和新声明.我无法将windows.h移动到Window.h的实现(Window.cpp),因为该类具有HWND属性.
我能想到的唯一解决方法是将hwnd声明为指针:
void* hwnd;
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方法.如果你这么做的话,事情可能会变得非常混乱.有没有更好的方法来做到这一点,也许以某种方式"删除"Main.cpp文件中的声明和宏?