我有一个看起来像这样的功能:
template <typename... A, typename... B>
void foo(Foo<A...>&, Foo<B...>&);
问题是,我希望它接受两个参数的const / non-const版本中的任何类型的引用(lvalue / rvalue)。
已有16种组合,显然手动编写它们太多了。
我能看到的唯一解决方案是删除嵌套类型参数:
template <typename X, typename Y>
void foo(X&&, Y&&);
// + some SFINAE to enforce that X, Y are Foo-s
这是不可接受的,因为我确实需要知道这些嵌套类型A...
和B...
。我该怎么办?
答案 0 :(得分:6)
您可以通过转发引用接受参数并单独传递它们的类型,包装在辅助类型tag
中。
#include <type_traits>
#include <utility>
template <typename> struct tag {};
template <typename X, typename Y, typename... A, typename... B>
void foo(X&& x, Y&& y, tag<Foo<A...>>, tag<Foo<B...>>)
{
// handle x and y
}
template <typename X, typename Y>
void foo(X&& x, Y&& y)
{
return foo(std::forward<X>(x), std::forward<Y>(y)
, tag<typename std::decay<X>::type>{}
, tag<typename std::decay<Y>::type>{});
}