繁体   English   中英

扩展参数从模板参数中打包(值)

[英]expansion parameters pack (values) from template arguments

有一种尝试使用递归的常规方法来扩展包:

template<bool first> int func1(int value = 0) {
    return some_func(first, value);
}

template<bool first, bool... args> int func1(int value = 0) {
    return func1<args...>(some_func(first, value) );
}

在编译时间递归的最后一步,func1的调用是模棱两可的,第一个候选对象是第一个函数,很明显,在我的情况下有一些具体的专长:

int func1(int)[with bool first = false]

但是第二个是

int func1(int)[with bool first = false; bool ... args = {}]

您会看到这也是正确的-在第一个参数之后留空一组参数。 有什么想法可以防止这种情况吗?

谢谢

通过添加一个显式的second参数来消除基本情况与递归情况的歧义:

template<bool first> int func1(int value = 0) {
    return some_func(first, value);
}

template<bool first, bool second, bool... args> int func1(int value = 0) {
    return func1<second, args...>(some_func(first, value) );
}

Wandbox示例

所以最后,我没有使用递归,而是下面的唯一代码。

(实际上不需要std :: array,但从我的角度来看更有用,扩展也可以通过使用类似C的数组来存档)

template <bool... args> unsigned long func1() {
    std::array<bool, sizeof...(args)> ar{args...};

    // the piece specific for my task
    std::bitset<sizeof...(args)> bs;
    for(std::size_t i = 0; i < ar.size(); ++i) {
        bs[i] = ar[i];
    }

   // ... processing ... 
    return bs.to_ulong();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM