合計 昨日 今日

zxc
 
記事: 79
登録日時: 2012年8月11日(土) 20:16
お住まい: 日本の背骨(?)あたり
日記: 日記を見る (40)
日記
- 11月 2015
MSVC2013 (0)
   2015年11月20日(金) 23:45

+ 10月 2015
+ 8月 2015
+ 6月 2015
+ 4月 2015
+ 2月 2015
+ 11月 2014
+ 10月 2014
+ 9月 2014
+ 7月 2014
+ 11月 2013
+ 8月 2013
+ 7月 2013
+ 6月 2013
+ 4月 2013
+ 3月 2013
+ 2月 2013
+ 1月 2013
+ 12月 2012
+ 11月 2012
+ 10月 2012
+ 9月 2012
+ 8月 2012
カテゴリー
勉強
1 記事
制作
1 記事
日誌
1 記事
プログラミング
4 記事
疑問
3 記事
フィード
次へ

MSVC2013

パーマリンクby zxc on 2015年11月20日(金) 23:45

stackってあまり触れたことなかったなと思って

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
 
#include<string>
#include<iostream>
#include<vector>
 
using namespace std;
 
 
int main(){
 
    std::string str;
    std::string s("s"), p("p"), g("l"),q("q");
    cout << "stack?  pop back? get size?  (signed int only)";
    cout << "\n";
    cout << "stack->" << s <<"\n";
    cout << "pop back->" << p<<"\n";
    cout << "get size->" << g << "\n";
    cout <<"Quit->q\n"<<endl;
 
    std::vector<int> buffer;
    buffer.reserve(20);
    std::string num_buf;
    bool loop_continue(true);
 
    while( loop_continue ){
        cin >> str;
 
        if (str == s){
 
            cout << "\n->Please type number to stack" << endl;
            cin >> num_buf;
            int temp;
            try{
                temp = std::stoi(num_buf);
            }catch (const std::out_of_range &){
                cout << "Inputed Number is Out of range of Support by C++ int";
            }catch (const std::invalid_argument& ){
                cout << "Inputed is NOT number, please Input C++ int number";
            }
            buffer.push_back( temp );
        }
 
        if (str == p){
            if (!buffer.empty()){ buffer.pop_back(); }
            else{
                cout<< "buffer is Empty! CANNOT pop_back";
            }
        }
 
        if (str == g){
            std::copy(std::cbegin(buffer), std::cend(buffer), ostream_iterator<int>(cout, ", "));
            cout <<endl;
        }
 
        if (str == q){
            loop_continue = false;
        }
        cout << ">>inputed\n";
    //  count++;
        //cout << str;
    }
 
    return 0;
}

コメント数: 0 閲覧数: 1665

Managerくらす

パーマリンクby zxc on 2015年10月10日(土) 04:31

 お久しぶりな人はお久しぶりかもしれません。
キーボードにコーヒーを分け与えた結果、一部のキーが昇天してしまったzxcです。なんやかんやあってMS VS Community2013 の利用を一旦停止して再びVS2010でやってます。 Eclipseは情弱の私には(ry   これは前も書いたような気がする・・・

  とりあえずManagerクラスを考えてみます。これだけでは情報が少なすぎるので実際にはシーン切り替えを管理するSceneSwitcherとでもします。ここでちょっと今迷っているのがどうやってシーンを切り替えるべきタイミングをManagerクラスに知らせるかです。

選択肢
 
  1. SceneSwitcherの中にSceneなどを持つことで切り替えるべきタイミングを把握する
    ->SceneSwitcherは切り替わる選択肢を既に知っていて、公開するのはSwitch()等の抽象的な関数だけ中はごちゃごちゃ
  2. SceneSwitcherの外から教えてもらう
    ->enumか次に切り替わるべき型など切り替わる先を表すインターフェイスがpublicでないといけないし、うんぬんかんぬん。VS2010だとenum class 使えない。

良くも悪くもSceneの切り替えについて変更したいのならばSceneSwitcherに手を加える事になるのが前者に見える、ので前者にしようかと思うのだけれど。


コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Scene{
 public:
  ~
  virtual bool IsContinue()const=0;
  virtual ~Scene(){}
  ~
};
 
class SceneSwitcher{
 private:
  std::shared_ptr<Scene> scn_ptr;
 public:
  void Switch(){if( !scn_ptr->IsContinue() ){//switch scene } }
};


とかこんなのでいいんだろうか・・・

コメント数: 0 閲覧数: 1635

テンプレートクラスのprivate継承でインターフェイス増やす

パーマリンクby zxc on 2015年8月02日(日) 15:24

 タイトルのような事がC++では出来るっぽい。operator+=へのoperator+の実装の委譲なんかが検索すると出てくる。ここでoperator boolについて似たような事を考える。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
template<typename T>
class Validable{
    public:
        typedef T type;
        inline friend bool operator!(const type& t){return !( t.operator bool() );}//OK
 
        inline friend bool IsValid(const type& t){return ( t.operator bool() );}//ダメ
        inline friend bool IsInvalid(const type& t){return !( t.IsValid() );}//ダメ
};


 継承する子クラスがoperator boolを実装してテンプレート引数には子クラスが入る。CRTP/奇妙に再帰したテンプレートパターンとか言ったと思う


 なんでoperatorだとコンパイル通るのにユーザ定義メソッドだとコンパイル通らないのかわからぬ・・・これ前にも出会ったことのある現象のような・・・うーん
最後に編集したユーザー zxc [ 2015年8月02日(日) 15:29 ], 累計 1 回

コメント数: 2 閲覧数: 2124

std::array<T,N>とinitializer_list<T>

パーマリンクby zxc on 2015年6月19日(金) 23:18

 std::array<T,N>にはinitializer_listを引数にとるコンストラクタは無いらしい。 cpulsplusのarray
(でも {} で初期化してたと思うからあれはたぶん配列の初期化と一緒でこれとは違う?)

 例えばstd::arrayを内部にもつクラスの、std::arrayの初期化を伴うコンストラクタを考えてみる。
 
  1. initializer_listで受け取るようにする
  2. 可変長テンプレートで受け取るようにする

1の雰囲気(足りない場合と多い場合の処理は不適切かもしれないしそもそもコンパイルで死ぬかもしれない)
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
////std::array<Num,N> class::data;
ctor(std::initializer_list<Num> list) {
    if (list.size() > this->data.size()){
        std::copy(list.begin(), list.begin() + this->data.size(), this->data.begin());
    }
    else{
        std::copy(list.begin(), list.end(), this->data.begin());
    }


 ただし、クラスの内部ではなくそのまま扱い、型が同じだけど幾つか集まっているような(std::tuple<T,T,T,・・・,T>みたいな)ものを考えるのならば、2.の可変長テンプレートやmake_tuple様のヘルパ関数なんかに任せるほうが適切なのかもしれない。make_arrayの例

 要素数が確定してしまっていてそれらをどう初期化するのかが問題ならばinitializer_listでも良い、くらい限定的なんだろうかな・・・

コメント数: 4 閲覧数: 2991

VSCommunity2013導入

パーマリンクby zxc on 2015年6月14日(日) 01:24

 EclipseC++は私には早すぎた・・・ので勧められてCommunity2013を導入。 VSC++express2010に比べるとやっぱり色々と楽が出来そうで楽しみ。 constexprが効かないのでコンパイラ設定とか出来たらclangしたいかもしれない。


コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
#include<iostream>
#include<tuple>
 
using namespace std;
 
template<typename T>
using trio = std::tuple < T, T, T > ;
 
int main(){
    cout << "hello world\n";
    trio<int> t(4,3,7);
   
    cout << std::get<0>(t) << "," << std::get<1>(t) << "," << std::get<2>(t) << "\n";
 
    return 0;
}

コメント数: 0 閲覧数: 1756

オンラインデータ

登録ユーザー: なし