假设我有一堂课
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 ++有两个方面在您的情况下相互冲突:
默认模板参数不应位于非默认模板参数之前。
可变参数模板参数不应位于非可变参数模板参数之前。
在许多情况下,当然有可能正确声明和使用其参数不遵循这些规则的模板,但是对于这些问题,这些情况并不重要。在您的情况下,归因于您自己的个人原因,两个模板参数都希望成为模板中的最后一个参数。简而言之,这就是问题所在。
解决此冲突的最简单方法是使用内部模板:
template<CallbackType CB = ASYNC>
class CallbackClass {
public:
template<typename... Args> class Callback
{
}
};
然后,您的两个示例变为:
CallbackClass<>::Callback<int, int>
和
CallbackClass<ASYNC>::Callback<int, int>
当然,您将得到更长的类名。但是这就是typedef
和using
是。例如:
template<typename ...Args>
using DefaultCallback=CallbackClass<>::Callback<Args...>;
然后使用
DefaultCallback<int, int>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句