Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:模板元编程中的条件 < >我用C++模板元编程实现一个程序,它从编译时已知的给定号码“代码>号码下生成下一个素数。但是,我目前陷入困境,因为我需要在模板中使用条件值。因此,我正在寻找类似于C++中的三元运算等价物。_C++_Conditional Statements_Template Meta Programming - Fatal编程技术网

C++;:模板元编程中的条件 < >我用C++模板元编程实现一个程序,它从编译时已知的给定号码“代码>号码下生成下一个素数。但是,我目前陷入困境,因为我需要在模板中使用条件值。因此,我正在寻找类似于C++中的三元运算等价物。

C++;:模板元编程中的条件 < >我用C++模板元编程实现一个程序,它从编译时已知的给定号码“代码>号码下生成下一个素数。但是,我目前陷入困境,因为我需要在模板中使用条件值。因此,我正在寻找类似于C++中的三元运算等价物。,c++,conditional-statements,template-meta-programming,C++,Conditional Statements,Template Meta Programming,我目前的做法是: #include <iostream> #ifndef NUMBER #define NUMBER 6 #endif template <int P, int K = P - 1> struct is_prime { enum { value = P % K != 0 && is_prime<P, K - 1>::value }; }; template <int P> struct is_prim

我目前的做法是:

#include <iostream>

#ifndef NUMBER
#define NUMBER 6
#endif

template <int P, int K = P - 1>
struct is_prime
{
    enum { value = P % K != 0 && is_prime<P, K - 1>::value }; 
};

template <int P>
struct is_prime<P, 1>
{
    enum { value = 1 };
};

template<int P, bool B = is_prime<P>::value> 
struct next_prime
{
    // This doesn't work
    enum { value = ( B ? P : next_prime<P+1>::value )};
};

int main(int argc, char** argv)
{
    std::cout << "next prime >= " << NUMBER << ": " << next_prime<NUMBER>::value << std::endl;
    return 0;
}

有没有一个好的方法来做这件事而不使用C++ 11?< /p> 通常我看到通过专业化< /P>解决了这类问题。

template<int P, bool B = is_prime<P>::value> 
struct next_prime
 { enum { value = next_prime<P+1>::value }; };

template <int P> 
struct next_prime<P, true>
 { enum { value = P }; };

通常我看到这类问题是通过专业化解决的

template<int P, bool B = is_prime<P>::value> 
struct next_prime
 { enum { value = next_prime<P+1>::value }; };

template <int P> 
struct next_prime<P, true>
 { enum { value = P }; };

通常的做法不是使用专业化的
next_prime
?我试着像上面那样声明next_prime,然后用value=P创建一个专门化结构next_prime,用value=next_prime::value创建一个专门化结构next_prime,但这也不起作用。应该可以。关键是要避免实例化不需要的情况,否则它总是会发生,你会得到无限的实例化,因此你会出错。通常的做法不是使用专业化的
next\u prime
?@asterswitwings这会是什么样子?我试着像上面那样声明next_prime,然后用value=P创建一个专门化结构next_prime,用value=next_prime::value创建一个专门化结构next_prime,但这也不起作用。应该可以。关键是要避免实例化不需要的情况,否则它总是会发生,你会得到无限的实例化,因此你的错误。非常感谢!非常感谢你!
// std::bool_constant<boolValue> is available starting from C++17;
// in C++11/C++14 you can use std::integral_constant<bool, boolValue>

template <int P, int K = P - 1>
struct is_prime
   : public std::bool_constant<P%K && (not is_prime<P, K-1>::value)>
 { };

template<int P>
struct is_prime<P, 2> : public std::bool_constant<P%2>
 { };

template<int K>
struct is_prime<2, K> : public std::true_type
 { };

template<int P, bool B = is_prime<P>::value> 
struct next_prime : public next_prime<P+1>
 { };

template <int P> 
struct next_prime<P, true> : public std::integral_constant<int, P>
 { };