2016-11-16 32 views
2

有一个尝试使用通常的方式与递归扩展包:在编译时递归的最后一步扩展参数由模板参数包(值)

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)与布尔第一= FALSE]

但第二个是

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

你看到那也是正确的 - 第一个参数后面的空集合。 有什么想法来防止这种情况发生?

谢谢

回答

4

通过增加一个明确的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

+0

似乎这种结构(实际上的std ::阵列不是必需的,但是从我的角度来看更有用, 的扩张可以通过使用类似C的阵列太存档)可以减少到只有一个功能使用constexpr if – amigo421

0

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

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