c++ - 可变参数模板与默认模板参数相结合

标签 c++ c++11 template-meta-programming

假设我有一个类

enum CallbackType
{
    SYNC,
    ASYNC
}


template<CallbackType CB = SYNC, typename... Args>
class Callback
{
}

我希望能够有选择地指定回调类型,同时仍然能够拥有可变模板参数。现在我明白编译器无法区分它们,但也许有一些方法可以处理第一个模板参数是 CallbackType 的特定情况?

Callback<int int> //Should be Callback<SYNC, int, int>
Callback<ASYNC, int, int> //Should be Callback<ASYNC, int, int>

最佳答案

当涉及到可变参数模板时,C++ 有两个方面在您的情况下相互冲突:

  1. 默认模板参数不应位于非默认模板参数之前。

  2. 可变模板参数不应位于非可变模板参数之前。

在许多情况下,正确声明和使用其参数不遵循这些规则的模板当然是可能的,但这些情况对于本问题的目的并不重要。在您的情况下,归结为您的两个模板参数出于各自的原因都希望成为其模板中的最后一个参数。简而言之,这就是问题所在。

解决这种冲突的最简单方法是使用内部模板:

template<CallbackType CB = ASYNC>
class CallbackClass {

public:

    template<typename... Args> class Callback
    {
    }
};

然后,你的两个例子变成:

CallbackClass<>::Callback<int, int>

CallbackClass<ASYNC>::Callback<int, int>

当然,您最终会得到更长的类名。但这就是 typedefusing 的用途。例如:

template<typename ...Args>
using DefaultCallback=CallbackClass<>::Callback<Args...>;

然后使用

DefaultCallback<int, int>

关于c++ - 可变参数模板与默认模板参数相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505124/

相关文章:

html - 在 html 文件中寻找 <table>

C++ 2D数组内存分配

c++ - 结构成员的限制值

c++ - 用于检测模板特化的模板元函数

c++ - 元编程 : Failure of Function Definition Defines a Separate Function

c++ - 如何在通过 Wine(同一台计算机)运行的 linux 程序和 windows 程序之间共享内存?

c++ - 检查窗口是否失去焦点

c++ - 如何解压可变参数模板,以便初始化相应的成员?

c++ - 干净取消在输入/输出调用时阻塞的 std::thread

c++ - 如何使用模板处理多类型变量?