可变参数模板与默认模板参数组合

安德烈亚斯(Andreas Loanjoe)

假设我有一堂课

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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章