假设我有一个类模板
template<int I, int J> class bar { /* ... */ };
并希望使用以下模板模板
template<template<int> class C>
struct foo { void func(some_type arg); };
C
等于bar
,第二个模板参数绑定(固定)。实现这一目标的一种方法是
template<int J, template<int, int> class B>
struct use_foo_helper {
template<int I> using BJ = B<I,J>;
static void func(some_type arg) { foo<BJ>::func(arg); }
};
template<int J>
void foo_bar(some_type arg) { use_foo_helper<J,bar>::func(arg); }
但是,仅为此目的创建辅助类(use_foo_helper
)非常不方便。我宁愿只定义函数模板foo_bar
,但失败了:
template<int J>
void foo_bar(some_type arg)
{
// template<int I> using barJ = bar<I,J>; // this appears to be illegal
// for<barJ>::func(arg);
foo< ??? >::func(arg); // what shall I put in place of ???
};
问有没有办法避免帮助类? 问是否有更好的设计模式可以实现相同目标?
答案 0 :(得分:1)
您可以通过以下方式执行此操作:
template <int I, int J>
class bar{};
template <template<int> class C>
struct foo
{
static
void func(some_type arg){}
};
template <int J>
class foo_bar
{
template <int I>
using barJ = bar<I, J>;
public:
static
void call(some_type arg)
{
foo<barJ>::func(arg);
}
};
使用示例:foo_bar</*...*/>::call(/*...*/);
。
但是如果你只想修改类模板的一个参数,可以更简单地完成:
template <int J>
struct barJ
{
template <int I>
using type = bar<I, J>;
};
使用示例:foo<barJ</*...*/>::type>::func(/*...*/);
。