グローバルで名前付きの構造体しか認めないとか

std::for_eachを使うと,コンテナに対するループがちょっとカッコよく書けます.

#include <iostream>
#include <algorithm>
#include <vector>
void pred(int x){
std::cout << x << std::endl;
}
int main(){
std::vector<int> v;
for(int i=0;i<10;i++) v.push_back(i);
std::for_each(v.begin(), v.end(), pred);
return 0;
}

こんな感じ.このとき,for_eachの第3引数は,関数オブジェクトでもOK.

#include <iostream>
#include <algorithm>
#include <vector>
struct pred_t{
void operator()(int x){
std::cout << x << std::endl;
}
} pred;
int main(){
std::vector<int> v;
for(int i=0;i<10;i++) v.push_back(i);
std::for_each(v.begin(), v.end(), pred);
return 0;
}

こんな感じ.でもこれだと,使う場所(for_each)の場所と,定義する場所(struct定義してる場所)とが離れすぎて気持ち悪い.あとpred_tとか無駄に名前増えて気持ち悪い.で,さっきひらめいて,ローカルに,無名で構造体作ったらいけるんじゃないかと思って書いてみた.

#include <iostream>
#include <algorithm>
#include <vector>
int main(){
std::vector<int> v;
for(int i=0;i<10;i++) v.push_back(i);
struct{
void operator()(int x){
std::cout << x << std::endl;
}
} pred;
std::for_each(v.begin(), v.end(), pred);
return 0;
}

文法的には間違ってないと思うのに.これは動きません.テンプレートの引数に,ローカルで定義された構造体は渡せないらしい.さらに,無名構造体も渡せないらしい.

将来的(いわゆるC++0xと呼ばれるバージョン)では,ラムダ式が書けるようになるのでいいけど,現状は一番上の関数ポインタ渡しが一番楽か.

「グローバルで名前付きの構造体しか認めないとか」への2件のフィードバック

  1. はじめまして。
    C++0xはいつになるかわからないので(笑、現状ではboost::lambdaがベストな選択だと思ってます。
    もちろんboostがインストールされてないとダメですが…。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <boost/lambda/lambda.hpp>

    int main(){
    using namespace boost::lambda;

    std::vector<int> v;
    for(int i=0;i<10;i++) v.push_back(i);

    std::for_each(v.begin(), v.end(), (std::cout << _1 << '\n'));

    return 0;
    }

    返信
  2. やっぱ現状ではこれですよね.
    でもこの _1 が嫌いなんですよね….
    可読性的にも.

    C++やめたい…といいつつも使っている現状.

    返信

コメントする