C++ 模板指定的参数数

C++ 模板指定的参数数,c++,variadic-templates,c++17,C++,Variadic Templates,C++17,我有一个类,它需要根据类模板参数调整成员std::function的参数数量。参数声明如下: template<char Id, char ... Ids> class term; template<char Id, char ... Ids> class term{ public: template<typename ... Args> void operator()(Args &&... args)

我有一个类,它需要根据类模板参数调整成员
std::function
的参数数量。参数声明如下:

template<char Id, char ... Ids>
class term;
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::函数fn;
您可以对此进行调整,使参数具有不同的类型,但调整方式取决于签名的确切外观

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

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

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

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

// ...

std::function<void(Arg<>, Arg<Ids>...)> fn;
模板
使用Arg=int;//或者你喜欢什么类型
// ...
std::功能fn;
甚至:

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

// ...

std::function<void(Arg<Id>, Arg<Ids>...)> fn;
模板
使用Arg=int;//或者你喜欢什么类型
// ...
std::功能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));
}
#包括
#包括
#包括
模板
使用Arg=int;
模板
课堂用语{
公众:
模板
void运算符()(Args&&…Args){
fn(标准:正向(参数)…);
}
std::功能fn;
};
int main(){
任期;
断言((std::is_same::value));
}

我不会被问到任何问题,哈哈,我会更新question@CoffeeandCode,更新。当你在做的时候,除了函数参数,我怎么做同样的事情?@CoffeeandCode,我不明白这个问题。如果同一个答案不适用,那么作为一个单独的问题来问可能是值得的。