2013-01-21 89 views
4
template <template <typename> class F> struct call_me {}; 
template <typename T> struct maybe; 
template <typename... T> struct more; 

int main() 
{ 
    call_me<maybe> a; // ok 
    call_me<more> b; // error 
} 

我明白为什么​​失败。但我想让它工作。固定数量的可变模板模板参数

是否有解决方法,不涉及更改call_me(或添加专门化)?

+1

由于您无法修改call_me,因此您可以为更多的参数创建别名模板,并将其传递给call_me。 –

+0

这很难看,但它会起作用。是否有可能为此编写一个通用包装器? (为什么不是一个答案btw?) – helami

回答

4
template <template <typename> class F> struct call_me {}; 
template <typename T> struct maybe; 
template <typename... T> struct more; 
template <template <class...> class F> struct just_one { 
    template <class A> using tmpl = F<A>; 
}; 

int main() 
{ 
    call_me<maybe> a; 
    call_me<just_one<more>::tmpl> b; 
} 

不完全等同,但也许足够接近。

0

你可以换more

template <template <typename...> class Tmpl> 
struct variwrap 
{ 
    template <typename> struct Dummy 
    { 
     template <typename ...Brgs> 
     struct rebind 
     { 
      typedef Tmpl<Brgs...> other; 
     }; 
    }; 
}; 

现在你可以说call_me<variwrap<more>::Dummy>,而消费者可以用F::rebind<Args...>::other恢复more<Args...>。当然call_me无法知道Frebind成员,所以您需要添加专业化。

Yuck。

1
template <typename T> using onemore = more<T>; 

int main() 
{ 
    call_me<onemore> b; 
}