最終更新日時:
が更新

履歴 編集

テンプレートの再帰上限数workaround(rejected)

本提案の発起人: Akira Takahashi(@cpp_akira), Kohei Takahashi(@Flast_RO)

内容

BOOST_TEMPLATE_RECURSION_MAXのようなマクロで、現在のコンパイラのテンプレート再帰上限数を取得できるようにする。C++03の規格では17推奨、C++11の規格では1024推奨。

コンパイラ テンプレートの再帰上限数 情報提供者(copyrightに書くかもしれない名前)
GCC 4.6.1(C++03, C++0xモード) 900 Kohei Takahashi
VC++2008 489 Akira Takahashi
ICC 11.1 2000 hotwatermorning
VC++6.0 1251 Hirofumi Miki
VC++2003 1073 Hirofumi Miki
VC++2005 489 Hirofumi Miki
VC++2010 499 Hirofumi Miki

課題

検証コード

VCはアンドキュメントなので実際に試してみるしかない。

VC++2008

template <int N>
struct loop {
    static const int value = loop<N - 1>::value;
};

template <>
struct loop<0> {
    static const int value = 0;
};

static const int template_recursive_count = loop<489>::value; // 490でコンパイラが死ぬ

int main() {}

ICC 11.1

typedef unsigned int u32_t;
template<u32_t N>
struct depth {
    static u32_t const value = depth<N - 1>::value;
};

template<>
struct depth<0>
{
    static u32_t const value = 0;
};

int main()
{
    static int const value = 2001;
    depth<value>::value;
}

VC++6.0

template <int N>
struct loop {
    enum { value = loop<N - 1>::value };
};

template <>
struct loop<0> {
    enum { value = 0 };
};

static const int template_recursive_count = loop<1251>::value; // 1252でエラー

int main() {}

VC++2003

template <int N>
struct loop {
    static const int value = loop<N - 1>::value;
};

template <>
struct loop<0> {
    static const int value = 0;
};

static const int template_recursive_count = loop<1073>::value; // 1074でエラー

void main() {}

VC++2005

template <int N>
struct loop {
    static const int value = loop<N - 1>::value;
};

template <>
struct loop<0> {
    static const int value = 0;
};

static const int template_recursive_count = loop<489>::value; // 490でエラー

int main() {}

VC++2010

template <int N>
struct loop {
    static const int value = loop<N - 1>::value;
};

template <>
struct loop<0> {
    static const int value = 0;
};

static const int template_recursive_count = loop<499>::value; // 500でエラー

int main() {}