小编Jan*_*nis的帖子

具有固定数量的参数的函数由整数确定

我有一个类,其模板接受一个整数:

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)

这使得可以使用真实参数,但仍然存在使用任意数量参数的问题,并且不可能知道实际传递了多少参数.

c++ function c++11 c++14 c++17

18
推荐指数
3
解决办法
1724
查看次数

是否可以删除特定文件的声明和宏?

我有一个头文件(让我们称之为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文件中的声明和宏?

c++

2
推荐指数
1
解决办法
107
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

c++17 ×1

function ×1