関数オブジェクト 解答ページ | Programming Place Plus C++編【言語解説】 第34章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 本章の冒頭で取り上げた関数オブジェクトの例を改造して、初期値や増分値を自由に変更できるようにしてください。


たとえば、次のようにできます。

#include <iostream>

class Counter {
public:
    Counter(int init = 0) : mCount(init)
    {}

    inline int operator()(int n = 1)
    {
        mCount += n;
        return mCount;
    }

private:
    int mCount;
};

int main()
{
    Counter c1;
    Counter c2(100);

    std::cout << c1() << std::endl;
    std::cout << c1(3) << std::endl;
    std::cout << c1(-1) << std::endl;

    std::cout << c2() << std::endl;
    std::cout << c2(3) << std::endl;
    std::cout << c2(-1) << std::endl;
}

実行結果:

1
4
3
101
104
103

問題②

問題② 問題①をさらに改造して、Counter をクラステンプレートにしてください。


たとえば、次のようにできます。

#include <iostream>

template <typename T>
class Counter {
public:
    Counter(T init = 0) : mCount(init)
    {}

    inline T operator()(T n = 1)
    {
        mCount += n;
        return mCount;
    }

private:
    T mCount;
};

int main()
{
    Counter<int> c1(5);
    Counter<double> c2(5.5);

    std::cout << c1() << std::endl;
    std::cout << c1(3) << std::endl;
    std::cout << c1(-1) << std::endl;

    std::cout << c2() << std::endl;
    std::cout << c2(0.1) << std::endl;
    std::cout << c2(-0.1) << std::endl;
}

実行結果:

6
9
8
6.5
6.6
6.5


参考リンク

更新履歴

’2016/12/11 新規作成。



第34章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る