我正在阅读一些c ++代码,下面的代码列表让我很困惑.
我猜它会尝试定义一个专门的模板,它试图对输入的args类型进行特征化.但我得到了一些问题:
第一个模板看起来像派生和模板专业化,如果它是派生的,结构如何从自身派生?如果是模板专业化,那么模板定义在哪里?
template<typename F>
struct function_traits : public function_traits<decltype(&F::operator())>
{};
template<typename R, typename C, typename ... Args>
struct function_traits<R(C::*)(Args...) const> {
template<size_t i>
struct arg
{
using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
};
};
Run Code Online (Sandbox Code Playgroud) 我正在使用 c++11 可变参数模板,但是编译器抱怨模板实例化深度超过 900 的最大值,代码如下所示:
template<typename F1, typename F2>
composed<F1, F2> compose(F1 f1, F2 f2) {
return composed<F1, F2>(f1, f2);
}
template<typename F1, typename F2, typename... Fs>
auto compose(F1 f1, F2 f2, Fs... fs) ->decltype(compose(compose(f1, f2), fs...)) {
return compose(compose(f1, f2), fs...);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这个模板,如:
auto composed_func = compose(f1, f2, f3, f4);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将可变参数模板定义更改为:
template<typename F1, typename F2, typename F3, typename... Fs>
auto compose(F1 f1, F2 f2, F3 f3, Fs... fs) ->decltype(compose(compose(f1, f2), f3, fs...)) {
return compose(compose(f1, f2), f3, fs...);
} …Run Code Online (Sandbox Code Playgroud) 当我使用时
std::result_of<F(R)>
Run Code Online (Sandbox Code Playgroud)
像这样:
template<typename R, typename... Args>
class Task
{
//...
template<typename F>
auto Then(F&& f) -> Task<typename std::result_of<F(R)>::type(Args...)>
{
//...
}
};
Run Code Online (Sandbox Code Playgroud)
由于R是另一个函数的输出类型,所以R可能是void,在这种情况下,就会出现:
error: invalid parameter type ‘void’.
Run Code Online (Sandbox Code Playgroud)
所以问题是如何处理R是void和不是?