在C ++中编译和打印在编译时的阶乘

时间:2011-02-12 11:11:58

标签: c++ templates compile-time

template<unsigned int n>
struct Factorial {
    enum { value = n * Factorial<n-1>::value};
};

template<>
struct Factorial<0> {
    enum {value = 1};
};

int main() {
    std::cout << Factorial<5>::value;
    std::cout << Factorial<10>::value;
}

以上程序在编译期间计算阶乘值。我想在编译时打印阶乘值,而不是在运行时使用cout打印。我们怎样才能在编译时打印阶乘值?

我正在使用VS2009。

谢谢!

4 个答案:

答案 0 :(得分:33)

可以在编译器生成的消息中将因子打印为:

template<int x> struct _;
int main() {
        _<Factorial<10>::value> __;
        return 0;
}

错误讯息:

  

prog.cpp:14:32:错误:聚合'_&lt; 3628800&gt; __'类型不完整,无法定义           _ ::值GT; __;                                   ^

此处362880010的阶乘。

在ideone上查看:http://ideone.com/094SJz

所以你在寻找这个吗?


编辑:

Matthieu要求一个聪明的技巧来打印阶乘并让编译继续。这是一次尝试。它没有给出任何错误,因此编译成功并发出一个警告。

template<int factorial> 
struct _{ operator char() { return factorial + 256; } }; //always overflow
int main() {
        char(_<Factorial<5>::value>());
        return 0;
}

使用此警告进行编译:

  

main.cpp:实例化'_ :: operator char() [with int   factorial = 120]':main.cpp:16:39:从这里需要   main.cpp:13:48:警告:隐式常量转换溢出   [-Woverflow] struct _ {operator char(){return factorial + 256; }};   //总是溢出

此处1205的阶乘。

在ideone演示:http://coliru.stacked-crooked.com/a/c4d703a670060545

您可以编写一个漂亮的宏,并将其用作:

#define PRINT_AS_WARNING(constant) char(_<constant>())    

int main() 
{
         PRINT_AS_WARNING(Factorial<5>::value);
         return 0;
}

looks great

答案 1 :(得分:7)

  

我正在学习TMP的基础知识,并希望在编译时知道结果,以确保逻辑正确。

在这种情况下,你真正想要的是静态断言:

static_assert(Factorial<5> ::value ==     120,  "5! should be 120");
static_assert(Factorial<10>::value == 3628800, "10! should be 3628800");

如果您的编译器尚不支持static_assert,您可以使用BOOST_STATIC_ASSERT

答案 2 :(得分:1)

我确定为时已晚,但仍然如此。

try
        {
          bool isvalid =ValdiateXMl(request.email);
    if(!isvalid)
{
    "invalid email"
}

        }
        catch (Exception ex)
        {


            log.Info(ex.Message);
            response.ErrorCode = -1;
        }
        finally
        {
                      log.Info("invalid email"); 
        }

答案 3 :(得分:0)

绝对没有标准的方法。我也想不出特定于编译器的方式。

[[填充剂]]