我有一个类需要根据类模板参数调整成员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;
};
我该如何解决这个问题?
答案 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));
}