定数式 - constexpr (c++11)

 

定数式 - constexpr について記載します。

constexpr は c++14 でさらに機能拡張しています。

 

 

 

1. 始めに

[概要]

始めに「constexpr 指定子 (C++11以上) - cppreference.com」で記載されているサンプルプログラムを動作させてみます。

 

[環境]

コンパイラ : g++, 9.3.0
OS: Ubuntu (WSL2), 20.04

 

 

[プログラムソース "constexpr_01.cpp"]

#include <iostream>
#include <stdexcept>

 
// C++11 の constexpr 関数は繰り返しではなく再帰を使用します
// (C++14 の constexpr 関数はローカル変数やループを使用できます)。
constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n - 1));
}


// リテラルクラス。
class conststr {
    const char* p;
    std::size_t sz;
public:
    template<std::size_t N>
    constexpr conststr(const char(&a)[N]): p(a), sz(N - 1) {}
 
    // constexpr 関数は例外を投げることによってエラーを知らせます。
    // C++11 では条件演算子 ?: でそれを行わなければなりません。 
    constexpr char operator[](std::size_t n) const
    {
        return n < sz ? p[n] : throw std::out_of_range("");
    }
    constexpr std::size_t size() const { return sz; }
};


// C++11 の constexpr 関数は単一の return 文にすべてを詰め込む必要がありました
// (C++14 にはその要件はありません)。
constexpr std::size_t countlower(conststr s, std::size_t n = 0,
                                             std::size_t c = 0)
{
    return n == s.size() ? c :
           'a' <= s[n] && s[n] <= 'z' ? countlower(s, n + 1, c + 1) :
                                       countlower(s, n + 1, c);
}
 
// テスト用のコンパイル時定数を要求する出力関数。
template<int n>
struct constN
{
    constN() { std::cout << n << '\n'; }
};
 
int main()
{
    std::cout << "4! = " ;
    constN<factorial(4)> out1; // コンパイル時に計算されます。
 
    volatile int k = 8; // volatile を用いて最適化を妨げます。
    std::cout << k << "! = " << factorial(k) << '\n'; // 実行時に計算されます。
 
    std::cout << "the number of lowercase letters in \"Hello, world!\" is ";
    constN<countlower("Hello, world!")> out2; // conststr に暗黙に変換されます。
}

 

[出力]

4! = 24
8! = 40320
the number of lowercase letters in "Hello, world!" is 9

 

 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

Copyright © 2021 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

 

参考

 


 

変更履歴

2021-11-21 - 新規作成