嵌套模板参数以及函数参数的cv和ref限定符

时间:2016-06-06 14:04:29

标签: c++ templates c++11 variadic-templates

我有一个看起来像这样的功能:

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...。我该怎么办?

1 个答案:

答案 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>{});
}

DEMO