-1

我的 nullPointcheck 函数:

template<typename T, typename... Args>
bool __nullPointCheck(T first, Args... args)
{
    bool ret = true;
    va_list vl;
    auto n = sizeof...(args);
    va_start(vl, n);
    for (auto i = 0; i <= n; ++i)
    {
        auto p = va_arg(vl, T);
        if (!p)
        {
            ret = false;
        }
    }
    va_end(vl);
    return ret;
}

但我收到如下 ndk 构建错误:

'va_start' used in function with fixed args
va_start(vl, n);

当我将 va_start 中的第二个参数更改为第一个参数时,如下所示:

va_start(vl, first);

ndk-build 导出错误如下:

     'va_start' used in function with fixed args
    va_start(vl, first);
    ^
E:/ANDROID_HOME/android-ndk-r10c/toolchains/llvm-3.5/prebuilt/windows-x86_64/bin
\..\lib\clang\3.5\include\stdarg.h:33:29: note:
expanded from macro 'va_start'
#define va_start(ap, param) __builtin_va_start(ap, param)

vs2013没有错误,但是代码可以通过ndk-build阶段

4

2 回答 2

5

va_startetc. 只能用于原型以...);. 这与参数包不同。您的代码使用参数包。使用参数包的语法与可变参数函数的语法不同。

我假设true当且仅当所有参数都是非空指针时,您的函数才应该返回。实现您的功能的一种方法是:

inline constexpr bool nullPointCheck() { return true; }

template<typename T, typename... Args>
constexpr bool nullPointCheck(T&& first, Args&&... args)
{
    return first && nullPointCheck(args...);
}

rontgen的回答也不错。


您实际上可以使用此函数来检查任意参数列表是否为 all true。我使用了通用引用,因此不会对参数进行复制;这对指针没有影响,但可能对更复杂的类型产生影响。

要将函数限制为仅接受指针,请更改T&&T *. (保持Args&&原样)。如果您还想接受文字,nullptr那么您还需要一个重载:

inline constexpr bool nullPointCheck(std::nullptr_t) { return false; }

因为nullptr其实并没有演绎到任何T *

于 2016-04-27T03:18:39.243 回答
1

我可以通过编译阶段的解决方案如下:

template<typename T, typename... Params, std::size_t N = sizeof...(Params)>
static bool nullPointCheck(Params... params)
{
    std::array<T, N> arr = { params... };
    for (auto point : arr)
    {
        if (!point)
        {
            return false;
        }
    }
    return true;
}
于 2016-04-27T03:07:25.720 回答