涉及模板参数变通方法的模板参数
template argument involving template parameters workaround
我有以下部分专业化:
constexpr int NUM_ARGS = 3;
template <typename, typename, int> struct Dispatcher;
template <typename T, typename V>
struct Dispatcher<T, V, NUM_ARGS-1> {};
但现在我需要NUM_ARGS本身作为Dispatcher中的模板参数。但是
template <typename, typename, int, int> struct Dispatcher;
template <typename T, typename V, int NUM_ARGS>
struct Dispatcher<T, V, NUM_ARGS, NUM_ARGS-1> { ...
是非法的。那么,解决方法是什么呢?
对于Pradhan的解决方案,这种非法专业化的解决方案是什么?
template <int M, int N, typename... Args> struct Test;
template <int M, typename... Args>
struct Test<M, M-1, Args...> {};
其中甚至不允许使用默认模板参数?
虽然不能在专门化参数中对模板参数进行算术运算,但可以在类型参数中进行。用一个比问题中的例子更简单的例子来说明:
template <int M, int N, typename Specialization = void>
class Test
{
public:
void foo(){cout << "Primary template." << endl;}
};
template <int M, int N>
class Test<M, N, enable_if_t<N==M-1>>
{
public:
void foo(){cout << "Specialization." << endl;}
};
int main()
{
Test<5,10>().foo();
Test<5,4>().foo();
return 0;
}
输出:
Primary template.
Specialization.
EDIT:为了允许可变参数,我们必须将Specialization
保留为没有默认值的类型参数,并使用模板别名使接口更干净。
template <int M, int N, typename Specialization, typename... Rest>
class Test
{
static_assert(std::is_same<Specialization, void>::value, "Don't use Test directly. Use TestHelper instead.");
public:
void foo(){cout << "Primary template." << endl;}
};
template <int M, int N, typename... Rest>
class Test<M, N, enable_if_t<N==M-1>, Rest...>
{
public:
void foo(){cout << "Specialization." << endl;}
};
template <int M, int N, typename... Rest>
using TestHelper = Test<M, N, void, Rest...>;
int main()
{
TestHelper<5,10, int, double, char>().foo();
TestHelper<5,4, int, double, char>().foo();
return 0;
}
Coliru演示。
相关文章:
- 使用在用于SFINAE的void_t中具有参数的方法
- 如何制作一个将函数作为参数的类方法
- c++方法参数只能在linux的发布模式下自行更改
- 使用用户定义的参数调用future/async并调用类方法
- 将成员函数指针作为参数传递给模板方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 具有字符串化的可变参数宏的现代/通用方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 如何在方法中传递结构参数
- 如何将类成员方法的参数列表自动填充写入可变参数?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- C++接口继承不同的参数方法
- C++ 模板:重载时找不到基类类型参数方法
- 如何使用迭代器作为参数方法?
- 具有不同亚型的参数方法
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 如何将 C 中声明的可选参数方法转换为 c++
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?