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<more>会失败。但我想让它发挥作用。

是否有不涉及更改call_me(或为其添加专业化)的解决方法?

4

3 回答 3

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;  
}

不完全等效,但可能足够接近。

于 2013-01-21T21:08:37.240 回答
1
template <typename T> using onemore = more<T>;

int main()
{
    call_me<onemore> b;
}
于 2013-01-22T02:07:34.293 回答
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没有办法知道F 成员rebind,所以你需要添加一个专业化。

呸。

于 2013-01-21T21:01:08.573 回答