C++相談室 part112at TECH
C++相談室 part112 - 暇つぶし2ch715:デフォルトの名無しさん
14/05/26 09:20:12.29 sSiCZOUk
>>713はエスパーなのか?

716:デフォルトの名無しさん
14/05/26 13:27:45.99 yHJImmyi
アスペーvsエスパー

717:デフォルトの名無しさん
14/05/26 21:16:32.24 l0k3Jdk0
関数のtemplate初心者です。
あまり良い例ではないかもしれませんが、以下のような関数を作った場合、
templateを使って引数では、string,char か wstring,wchar_t のどちらにも対応できますが、
関数の中で
string,char対応の関数(sprintf)を使う場合と
wstring,wchar_t対応の関数(wsprintf)を使う場合と
どうやって切り替えたらよいのでしょうか?

template<typename stringT, typename charU> stringT join_string_and_char(const stringT &str, const charU c){
      charU stringJoined[100];
//     sprintf(stringJoined, "%s and %c", str.c_str(), c);
      wsprintf(stringJoined, L"%s and %c", str.c_str(), c);
      return stringJoined;
}

void main(){
//     string result1 = join_string_and_char<string, char>("string", 'C');
//     cout << result1 << endl;

      wstring result2 = join_string_and_char<wstring, wchar_t>(L"wstring", 'C');
      wcout << result2 << endl;
}

718:デフォルトの名無しさん
14/05/26 21:24:31.57 fNjo4Ias
Type Traitsとかいうテクニックが使えたような

719:デフォルトの名無しさん
14/05/26 21:24:44.86 Z2JGB+L6
>>717
二つ書けばいい
template<typename stringT, typename charU> stringT join_string_and_char(const stringT &str, const charU c){
      charU stringJoined[100];
      wsprintf(stringJoined, L"%s and %c", str.c_str(), c);
      return stringJoined;
}

template<>
string join_string_and_char(const string &str, const char c){
      char stringJoined[100];
     sprintf(stringJoined, "%s and %c", str.c_str(), c);
      return stringJoined;
}

720:デフォルトの名無しさん
14/05/26 21:27:43.49 PY35gZD3
>>717
wsprintfAとwsprintfWをそれぞれwsprintf<char>とwsprintf<wchar_t>のメソッドにする。あとはわかるな
あとsprintfとwsprintfは出自の違う関数だから
最大文字数の制限もちがうのでまぜちゃだめ

721:デフォルトの名無しさん
14/05/26 22:22:12.29 YKj2th5u
>>720は会話の出来ないアスペ

722:デフォルトの名無しさん
14/05/26 22:39:49.53 sSiCZOUk
>>717
その例じゃ、
return stringT(str + c);

としろとしか言えん。
つまり引数自身が持ってるメソッドを使う。

723:デフォルトの名無しさん
14/05/26 22:46:39.43 RXW919A3
どうしてこんなにアスペ&文盲が多いのか。
>>720 >>722は社会の中でちゃんと生活できてるか?

724:デフォルトの名無しさん
14/05/26 23:02:23.28 8opg2BGX
CentOS6.5
gcc4.4.7

日本語の正規表現をC++で扱いたいのでネットで調べたのですが、わからない事があるので教えてください。

(1)「マルチバイト文字列」と「ワイド文字列」とはwindows環境で使われるShiftJISとUTF16のことでLinux(UTF-8)環境では関係ない。

(2)Linux(UTF-8)環境での日本語の正規表現は、std::basic_regexでもboost::regexでも正しく動作する。

ということでいいでしょうか?

725:デフォルトの名無しさん
14/05/26 23:04:23.62 sSiCZOUk
>>723
エスパーにでもなったつもりかw

先回りして「こういうことが聞きたいんだろうか・・・」なんて考えてもムダなことが多いんだよ。

726:デフォルトの名無しさん
14/05/26 23:19:11.71 5ILZATTz
>>725
「例が悪いけど~どうやって切り替えたら」
と聞いてるんだから>>718の回答が妥当。
例の揚げ足をとる回答しかできないのはコミュ障

727:デフォルトの名無しさん
14/05/26 23:23:00.98 4UfKpyVP
value_type で場合分けするんでもイケそうだけど

728:デフォルトの名無しさん
14/05/26 23:30:38.09 hUfkYiG/
個人的にはテンプレート特化を使う>>719の案の方がtemplateらしくて好き
コードは膨らむけど動作は軽いだろうし・_・)

729:デフォルトの名無しさん
14/05/26 23:38:05.72 YwJBAaZh
>>724
>Linux(UTF-8)環境では関係ない
んなこたーない。

>std::basic_regexでもboost::regexでも正しく動作する
GCCのregexは未完成かつバグだらけで
英語でも使い物にならないんじゃなかったっけか

730:デフォルトの名無しさん
14/05/26 23:48:07.49 sSiCZOUk
>>726
引数自身が持ってるメソッドを使えってのがまともじゃないってのかよ?

731:デフォルトの名無しさん
14/05/27 00:10:01.85 WxzaE4HE
文盲が多いな
どうしたらこの例でコードを共通化できるかを問う質問ではなく
切り替えるには一般にどうしたらよいかという質問だろ

732:デフォルトの名無しさん
14/05/27 00:14:11.32 z7A4bs15
template < typename T, template < typename U, typename = std::char_traits< U >, typename = std::allocator< U > > class C >
C< T > jsac( C< T > const &str, T const c ) {
return str + c;
}

じゃあこんなんでDOUDAI?(´・ω・`)

733:デフォルトの名無しさん
14/05/27 00:14:17.45 uAEnCVdL
うちの会社にいる。

734:デフォルトの名無しさん
14/05/27 00:15:18.85 uAEnCVdL
途中で送ってしまった。

>>731
うちの会社にいる。ただしわざと。

不備のある質問には不備のある回答をする、
意図に不明確な点があれば、やっぱり不明確な回答をする、
というポリシーらしい。

的を射た質問には喜んで答えるんだけどね。

735:デフォルトの名無しさん
14/05/27 03:23:26.62 542ZOO3N
>>729
学生がちゃんとしたの作ってなかったっけ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch