8

正如 ecatmur 所指出的,这个问题在这里已经有了答案。

这个问题显然不是使用带有可变参数模板函数的 decltype 的尾随返回类型的重复。它实际上试图提出一个更简单的解决方案来解决该线程中的问题。问题是这个解决方案根据标准是否正确,因为 GCC 和 clang 不同意。仔细阅读这个问题,你就会意识到这一点。

这个问题是受这个启发的。我试图提出一个比已经提供的更简单的解决方案,并最终得到这个:

#include <iostream>

struct S {
    template <typename T>
    static T sum(T t){
        return t;
    }

    template <typename T, typename ...U>
    static auto sum(T t, U... u) -> decltype(t + sum(u...)) {
        return t + sum(u...);
    }
};

int main() {
    std::cout << S::sum(1, 1.5, 2) << '\n';
}

虽然此解决方案适用于 GCC,但它根本无法解决 clang 的问题。所以,我想知道哪个是正确的。

4

1 回答 1

0

我想出的最佳解决方法是:

#include <iostream>

struct S {
    template <typename T>
    static T sum(T t){
        return t;
    }

    template <typename S, typename T>
    static auto sum(S s, T t) -> decltype(s + t) {
        return s + t;
    }

    template <typename S, typename T, typename ...U>
    static auto sum(S s, T t, U... u) -> decltype(s + t) {
        return s + sum(t, u...);
    }
};

int main() {
    std::cout << S::sum(1, 1.5, 2) << '\n';
}

clang 似乎在解决 decltype 指令中的递归函数/方法时遇到问题......

于 2015-05-08T10:02:19.023 回答