如何反省可变参数模板模板参数的arity?

bru*_*tra 6 c++ templates metaprogramming

考虑一个假设的元函数arity,它将任何元函数作为参数并返回其实际的元素.

以下明显的方法是不可能的,因为名为内部模板模板参数的语言标准仅在本地定义.

template<template<typename... args> class f>
struct arity
{
    static constexpr std::size_t value = sizeof...(args); //ERROR: undefined 'args'
};
Run Code Online (Sandbox Code Playgroud)

甚至没有详尽的专门化是另一种选择,因为采用另一种模板类型的模板类型在内部模板的参数数量方面可能不是部分专用的.

这让我想到了一个问题,我担心其答案是否定的.

有没有合理的方法来反省模板类型的实际特征?

我不希望实际实现arity采用模板类型的形式,例如在显而易见的方法中,也就是说,在编译期间可以计算的任何东西都可以作为"合理"的解决方案,只要它不是不依赖于实际的论点.

注意:为简单起见,假设只允许非变量元函数作为参数arity.

bru*_*tra 2

虽然采用模板模板参数的模板类型确实可能不会就其模板模板参数的数量进行部分专门化,但函数可能会以这种方式重载。

template<template<typename> class f>
constexpr std::size_t _arity(){return 1;}
template<template<typename, typename> class f>
constexpr std::size_t _arity(){return 2;}
template<template<typename, typename, typename> class f>
constexpr std::size_t _arity(){return 3;}
//...
template<template<typename...> class f>
constexpr std::size_t _arity(){return 0;}

template<template<typename... args> class f>
struct arity
{
    static constexpr std::size_t value = _arity<f>();
};
Run Code Online (Sandbox Code Playgroud)

虽然并不理想,但这种方法在合理的范围内有效,并且是我能想到的最接近“合理”的解决方案。然而,我仍在寻找一种纯粹的可变参数解决方案,它不需要详尽地枚举函数/类型。