【问题标题】:expansion parameters pack (values) from template arguments模板参数中的扩展参数包(值)
【发布时间】:2016-11-16 09:32:17
【问题描述】:

尝试使用通常的递归方式扩展包:

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) [bool first = false]

但第二个是

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

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

谢谢你

【问题讨论】:

    标签: c++ variadic-templates


    【解决方案1】:

    通过添加显式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 example

    【讨论】:

    • 似乎可以使用 constexpr if 将此构造简化为仅一个函数
    【解决方案2】:

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

    (实际上 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 2014-10-30
      • 2014-12-17
      • 2014-04-12
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多