fac*_*tum 8 c++ templates variadic-templates c++11
我有一个问题涉及C++中模板类的函数模板参数.
我想定义一个Foo
采用单个模板参数的模板类Fun
template <typename Fun>
struct Foo {
...
};
Run Code Online (Sandbox Code Playgroud)
这样的功能就像
void bar(std::string a, float b, char c)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后Foo<bar>::args_t
将相当于一个typedef
std::tuple<std::string, float, char>
Run Code Online (Sandbox Code Playgroud)
这可能吗?(std::tuple
这里的用法仅仅是为了具体.更一般地说,我想知道是否可以对功能模板参数的参数进行模式匹配.)
重点是避免必须以Foo
类似的方式定义
template Foo<typename A, typename B, typename C, typename D,
D (*Fun)(A a, B b, C c)>
struct Foo {
typedef std::tuple<A,B,C> args_t;
};
Run Code Online (Sandbox Code Playgroud)
这需要提交到固定数量的函数参数,并要求函数的参数和返回类型作为模板参数显式提供.(Foo
使用可变参数模板定义可能会解决前一个问题,但后者呢?)
谢谢!
Pra*_*ian 13
声明主模板并使其未实现.
template<typename T>
struct foo; // unimplemented primary template
Run Code Online (Sandbox Code Playgroud)
然后提供一个将函数类型作为模板参数匹配的部分特化.
template<typename Result, typename... Args>
struct foo<Result(Args...)>
{
using args_t = std::tuple<Args...>;
};
Run Code Online (Sandbox Code Playgroud)
您可以访问嵌套类型
foo<decltype(bar)>::args_t
Run Code Online (Sandbox Code Playgroud)