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

时间:2016-11-16 09:32:18

标签: c++ variadic-templates

尝试使用递归的常规方法扩展包:

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 = {}]

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

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

 factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
 EntityManager em = factory.createEntityManager();
 // Read the existing entries and write to console

String qSelect = "SELECT d.de - CURRENT_Date as newde  FROM Deinfo d   ";

Query q = em.createQuery(qSelect);