模板指定的参数数量

时间:2016-07-10 07:00:53

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

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

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

然后在类的主体中我有一个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;
};

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

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

您可以调整此选项以使参数的类型不同,但您如何调整它可能取决于签名应该是什么样的。

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

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

答案 1 :(得分:0)

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

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));
}