模板指定的参数数量

Number of arguments specified by template

我有一个 class 需要根据 classes 模板参数调整成员 std::function 接受的参数数量。参数声明如下:

template<char Id, char ... Ids>
class term;

然后在 class 的正文中,我有一个 std::function 需要采用 1 + sizeof...(Ids) 一些数字类型的参数(所有类型相同)。

主体声明如下:

template<char Id, char ... Ids>
class term{
    public:
        template<typename ... Args>
        void operator()(Args &&... args){
            fn(std::forward<Args>(args)...);
        }

        std::function<void(/* whats do? */)> fn;
};

我该怎么做?

由于您没有说明 fn 的参数类型,我假设所有 char。在那种情况下:

std::function<void(char, decltype(Ids)...)> fn;

您可以调整它以使参数类型不同,但如何调整它取决于签名的确切外观。

对于所有相同的数字类型,最简单的调整可能是这样:

std::function<void(char, decltype(Ids, YourNumericType{})...)> fn;

一种可能的方法是使用别名模板,例如:

template<char...>
using Arg = int; // or whatever is your type

// ...

std::function<void(Arg<>, Arg<Ids>...)> fn;

甚至:

template<char>
using Arg = int; // or whatever is your type

// ...

std::function<void(Arg<Id>, Arg<Ids>...)> fn;

它遵循一个最小的工作示例:

#include<type_traits>
#include<functional>
#include<cassert>

template<char...>
using Arg = int;

template<char Id, char ... Ids>
class Term {
public:
    template<typename ... Args>
    void operator()(Args &&... args){
        fn(std::forward<Args>(args)...);
    }

    std::function<void(Arg<>, Arg<Ids>...)> fn;
};

int main() {
    Term<'a', 'b', 'c'> term;
    assert((std::is_same<decltype(term.fn), std::function<void(int, int, int)>>::value));
}