模板指定的参数数量
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));
}
我有一个 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));
}