小编D.p*_*.pz的帖子

这个模板定义在c ++中意味着什么?

我正在阅读一些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++ c++11

6
推荐指数
1
解决办法
240
查看次数

c++ 可变参数模板实例化深度超过最大值 900

我正在使用 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)

c++ variadic-templates c++11 trailing-return-type

5
推荐指数
1
解决办法
1218
查看次数

c ++如何定义可以处理R的std :: result_of <F(R)>是无效的

当我使用时

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)

所以问题是如何处理Rvoid和不是?

c++ c++11

1
推荐指数
1
解决办法
137
查看次数