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