我有一个问题涉及C ++模板类的功能模板参数。
我想定义一个模板类Foo
,只需一个模板参数Fun
template <typename Fun>
struct Foo {
...
};
这样就给出了像
这样的函数 void bar(std::string a, float b, char c)
{
...
}
然后Foo<bar>::args_t
将等同于
std::tuple<std::string, float, char>
这可能吗? (这里使用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;
};
需要提交固定数量的函数参数,并要求函数的参数和返回类型作为模板参数显式提供。 (使用可变参数模板定义Foo
可能会解决前一个问题,但后者又如何呢?)
谢谢!
答案 0 :(得分:13)
声明主要模板并将其保留为未实现。
template<typename T>
struct foo; // unimplemented primary template
然后提供一个将函数类型作为模板参数匹配的部分特化。
template<typename Result, typename... Args>
struct foo<Result(Args...)>
{
using args_t = std::tuple<Args...>;
};
您可以将嵌套类型作为
进行访问foo<decltype(bar)>::args_t