5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【C++】template 統合スレ -- Part3

1 :デフォルトの名無しさん:03/10/19 01:04
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。

STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/
【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)

関連スレ、その他リンクは >>2-5 あたりに。

866 :865:04/04/18 15:07
あ、間違えました。すいません。

誤:template<typename T> typedef T* add_ptr<T>;
正:template<typename T> typedef T* add_ptr;

867 :デフォルトの名無しさん:04/04/19 22:33
BCB6で boost::mt19937 使えてますか?(1.31.0)
static const 周りでバグってるみたいなんですけど。

868 :デフォルトの名無しさん:04/04/19 23:12
>>867
普通に使えてるよ。BCC5.6.4。
#include <iostream>
#include <boost/random.hpp>

int main()
{
 boost::mt19937 mts;

 for (int i = 0; i < 100; i++)
  std::cout << mts() << ' ';
}

869 :デフォルトの名無しさん:04/04/20 07:19
>>868
distributionを使うとダメみたいなんです。
documentに書いてあるサンプルの↓

http://www.boost.org/libs/random/index.html
boost::mt19937 rng;
boost::uniform_int<> six(1,6);
boost::variate_generator<boost::mt19937, boost::uniform_int<> > die(rng, six); ←ここ
int x = die();

ここで Access Violation になっちゃいます。
他のgeneratorなら大丈夫なので、使い方は合っていると思うんだけど。
どうやら static const の初期化がうまくいっていないような……(調査中)

http://boost.sourceforge.net/regression-logs/cs-win32.html
で random_test が Fail になってることと関係があるのかな。

870 :デフォルトの名無しさん:04/04/20 12:21
>>869
俺の環境では(WindowsXP SP1+BCC5.6.4)、Access Violation
にならずに何のエラーも出さずにvariate_generator()を呼び出した
時点で正常終了してしまう。

gcc3.3.3やVC7.1だと動くねえ。

871 :デフォルトの名無しさん:04/04/21 00:27
typedef GenScatterHierarchy< TYPELIST_3< double, double, double> > AAA;

int main(void)
{
AAA aaa;
for ( size_t i( 0 ); i < Length<AAA>::value; ++i )
{
Field< i >( aaa ) = i;
}
}

Field< i > で怒られますが何か手はありませんか?

872 :デフォルトの名無しさん:04/04/21 00:44
>>871
何がしたいの?
エラーメッセージは?

873 :デフォルトの名無しさん:04/04/21 00:50
まぁとりあえずiがその書き方じゃコンパイル時に決まらんからそりゃ
template の引数に渡したらコンパイル出来ない罠。
ただ、その前に(Lokiを使ってるんだと思うが)かなーり間違ったコードに見えるが…

874 :デフォルトの名無しさん:04/04/21 10:12
やりたい事は、

double tmp0( 0 );
for ( size_t i( 0 ); i < size; ++i )
{
tmp0 += C[0] * a[0][i];
}

double tmp1( 0 );
for ( size_t i( 0 ); i < size; ++i )
{
tmp1 += C[0] * a[0][i] + C[1] * a[1][i];
}

double tmp2( 0 );
for ( size_t i( 0 ); i < size; ++i )
{
tmp2 += C[0] * a[0][i] + C[1] * a[1][i] + C[2] * a[2][i];
}

のforループを計算するクラスの自動生成です。

875 :デフォルトの名無しさん:04/04/21 13:12
>>871
struct f {
AAA& aaa; f( AAA& aaa ) : aaa(aaa) {}
template<class T> operator()(T) {Field<T::value>(aaa) = T::value;}
};
using namespace boost::mpl;
for_each< range< size_t<0>, Length<AAA> > >( f(aaa) );

Lokiは使ったことないから知らんが、何でその用途でGenScatterHierarchyしてんの?

876 :デフォルトの名無しさん:04/04/21 14:38
>>875 >>874をやろうと試みた一環です。
さらに、質問します。
Barton Nackman trickをサーチして以下のコードを見つけました。
このようなコードはどういった文脈で使うことを想定しているのでしょう?



877 :デフォルトの名無しさん:04/04/21 14:39
#include <iostream>
template< class T_mesh >
class Mesh {
public:
Mesh() {
Dimension = asLeaf().getDimension();
std::cout << " Mesh: Dimension = " << Dimension << std::endl; }
~Mesh() {}
T_mesh& asLesf() { return static_cast<T_mesh&>(*this); }
protected:
size_t Dimension;
};
template< class T_number, size_t Dim >
class StructuredMesh : public Mesh< StructuredMesh< T_number, Dim > > {
public:
StructuredMesh() {
Dimension = Dim;
std::cout << " StructuredMesh: Dimension = " << Dimension << std::endl;
}
~StructuredMesh() {};
size_t getDimension() { return Dim; }
};
int main( void ) {
StructuredMesh<double, 3> grid;
return 0;
}

878 :デフォルトの名無しさん:04/04/21 14:57
>>877そのコードの出自がはっきりしないと文脈って言われても難しいな。とりあえずどこにあったコード?まぁ数値計算でメッシュを構築して何かをするんだろうなぁってのは分かるけど。

879 :デフォルトの名無しさん:04/04/21 16:54
>>876
自己言及なtemplateの事かなぁ。
使用状況としては仮想関数を使用せずに機能追加をしたい場合とか。
但し877の例は自己言及なテンプレートの例としてはいまいちな感じ
がするので"Barton Nackman trick"=="自己言及なtemplate"なのかは
自信ない。


880 :デフォルトの名無しさん:04/04/21 17:53
>>879
> 自己言及なtemplateの事かなぁ。
yes.っていうか、877みたいな使い方か、あとせいぜいfriendを使って
グローバル関数を定義する技くらいしか自己言及的templateの使い方を
俺は知らないんだけど、他にどういうのがあるの?

>>876
> このようなコードはどういった文脈で使うことを想定しているのでしょう?
class Mesh { …自分自身を返すasLeaf()メソッドを実装… };
class StructuredMesh : public Mesh { … };
class HogerattaMesh : public Mesh { … };
class FunyarakaMesh : public Mesh { … };

StructuredMesh g1; g1.asLeaf(); // StructuredMesh&を返すようにしたい
HogerattaMesh g2; g2.asLeaf(); // HogerattaMesh&を返すようにしたい
FunyarakaMesh g3; g3.asLeaf(); // FuntarakaMesh&を返すようにしたい
って思わないか?

881 :デフォルトの名無しさん:04/04/21 18:16
>>使用状況としては仮想関数を使用せずに機能追加をしたい場合とか。
なるほどぉ〜。

882 :デフォルトの名無しさん:04/04/21 18:17
>>871
typedef Tuple<TYPELIST_3(double,double,double) > AAA;
まあタプルはboostの方にもあるけど。


883 :デフォルトの名無しさん:04/04/22 18:05
LokiのFunctorに関して質問します。

#include<iostream>
#include<algorithm>
#include<loki/Functor.h>
#include<loki/SmallObj.cpp>

template<size_t N>
class class1 {
public:
void voidfunc( void ) {std::cout << "class1 " << N << " func( void )" << std::endl;}
};

class class2 {
public:
void voidfunc ( void ) {std::cout << "class2 func ( void )" << std::endl;}
void sizefunc ( size_t i ) {std::cout << "class2 func ( " << i << " )" << std::endl;}
};



884 :デフォルトの名無しさん:04/04/22 18:10
int main( void )
{
class1< 100 > test1;
class2 test2;

Loki::Functor< void >
cmd1( &test1, &class1< 100 >::func ); // エラー

Loki::Functor< void >
cmd2( &test2, &class2::voidfunc ); // O.K.

Loki::Functor< void, TYPELIST_1( size_t ) >
cmd3( &test2, &class2::sizefunc ); // O.K.

std::vector < Loki::Functor< void > > v;
v.push_back( cmd1 );
v.push_back( cmd2 );
v.push_back( cmd3 ); //エラー 変数をbindしたい。

for ( size_t i( 0 ); i < v.size(); ++i )
v.[i](); // O.K.

std::for_each ( v.begin(), v.end(), boost::mem_fn( Loki::Functor< void >::operator() ) );// エラー

}

のエラー部分の記述方法を御教授いただけないですか?

885 :デフォルトの名無しさん:04/04/22 23:26
>>883
boost::functionとboost::bindを使った方がいいと思う・・・
・・・あれ、そいうえばコンパイラは?


886 :デフォルトの名無しさん:04/04/23 01:13
BCB-Xです。

887 :デフォルトの名無しさん:04/04/23 09:15
>>884
型が違うから、コンパイル通らない。
Loki::BindFirst を使いなさい。

v.push_back( Loki::BindFirst( cmd3, /*バインドしたい変数*/ ) );

バインドしたい引数が増えてきたら、Loki::Functor + コンテナをやめて、
Boost.Function, Boost.Bind, Boost.Signal に乗り換えると吉。

888 :デフォルトの名無しさん:04/04/23 18:36
template<typename T>
class B{};

template<typename T>
class C{};

template<typename T>
class C<B<T> > : C<T>{};

こんなことして大丈夫でしょうか?
多分,大丈夫だとは思うのですが・・・

889 :デフォルトの名無しさん:04/04/23 18:44
>>888
大丈夫

890 :デフォルトの名無しさん:04/04/23 19:25
>>887 signal使うと幸せになれる気がしてきました。
有益な情報ありがとうございました。

891 :デフォルトの名無しさん:04/04/23 23:41
>>879
C++相談室のほうで,friend関数の(宣言ではなく)定義をclass templateの
スコープ内に書くtrickのことをBarton-Nackman trickと呼んでいた者ですが,
"C++ Templates"ではこのように呼んでいたのでそうしていました.
で,この本にはさらに「このtrickはCuriously Recursive Template Pattern(CRTP)と
同時に用いられることが多く,CRTPが誤ってBarton-Nackman trickと呼ばれることが多い」
とありました.確かにCRTPのことをBarton-Nackman trickと呼んでいる人が多い
(877とか)ですが,厳密には違うということなんでしょう.細かいことですが.

892 :デフォルトの名無しさん:04/04/24 17:00
うーむ、template は面白いですね。勉強になります。
で、昨日まで CRTP という言葉も知らなかった香具師が突っ込むのもなんですが、
Curiously "Recurring" Template Pattern が正しいみたいです。

>891
>friend関数の(宣言ではなく)定義をclass templateのスコープ内に書くtrick
これは、14.5.3/5 によりインスタンス化ごとに関数定義が行われるため、
関数 template ではないが同じ効果が得られて(゚Д゚)ウマーという認識で
いいでしょうか。

ただどちらかと言うと、>880 の言う
>あとせいぜいfriendを使ってグローバル関数を定義する技くらいしか
の方が、Barton Nackman trick が指すものに近い表現じゃないかと思うのですけど
どうでしょ?
ttp://www.informit.com/articles/article.asp?p=31473&seqNum=5
は C++ Template の抜粋のようですが、
>Barton and Nackman frequently used CRTP in combination with
> friend name injection (and the latter is an important component
> of the Barton-Nackman trick)
という表記があるのでそう考えてみました。

ところで、>891氏「CLANNADの渚タンってどうよ?」

893 :880:04/04/24 17:55
> で,この本にはさらに「このtrickはCuriously Recursive Template Pattern(CRTP)と
> 同時に用いられることが多く,CRTPが誤ってBarton-Nackman trickと呼ばれることが多い」
うっへ。ほんとだ、俺は思いっきり間違えてました。
言われてみればCRTPはBarton/NackmanよりはCoplienタンのオハコだもんなぁ。。。

894 :デフォルトの名無しさん:04/04/25 01:15
>>892
>"Recurring"
両方の表現とも見かけますよ.

>14.5.3/5 によりインスタンス化ごとに関数定義が行われるため、
>関数 template ではないが同じ効果が得られて(゚Д゚)ウマー
はい.自分の意図はそうです.標準の該当項目引いてもらえて助かります.

>>あとせいぜいfriendを使ってグローバル関数を定義する技くらいしか
>の方が、Barton Nackman trick が指すものに近い表現
ですね.

>>Barton and Nackman frequently used CRTP in combination with
>> friend name injection (and the latter is an important component
>> of the Barton-Nackman trick)
>という表記があるのでそう考えてみました。
Barton-Nackman trickという言葉だけでは指しているものが曖昧になりますね.
以後,気をつけます.

>ところで、>891氏「CLANNADの渚タンってどうよ?」


>>893
でも,Todd VeldhuizenもBarton-Nackman trick == CRTPと解釈していて
正直,自分にもどの解釈が正しいか判断しかねています.
なのでCRTPと呼ぶのが一番誤解が少ないと思います.

895 :デフォルトの名無しさん:04/04/25 15:01
Modern C++ Design の P. ixに記述されているコードを理解したくて
Barton Nackman でググって>>877のコードを見つけました。
どなたかこれを解説してください。

896 :デフォルトの名無しさん:04/04/25 15:27
>>895
>>877は基底クラス(Mesh)から派生クラスのメンバ関数を呼び出すもので、
Modern C++ designのコードとは関係ない。

ところで、あの本のコードのどこが理解できないんだ?

897 :デフォルトの名無しさん:04/04/25 16:50
m,l,tの意味とか使用例とか見たいなぁと思ってググったんです。

898 :デフォルトの名無しさん:04/04/25 17:42
>>897
mは質量、lは長さ、tは時間だと思われ。
たとえば
typedef Physical<1, 0, 0> mass; /* 質量 */
typedef Physical<0, 2, -2> work; /* 仕事 */
typedef Physical<0, 1, -2> acceleration; /* 加速度 */
typedef Physical<1, 1, -2> force; /* 力 */

acceleration g(9.8); /* 重力加速度 */
force gravity = mass(4) * g; /* 質量と加速度をかけると力になる */
work fravity = mass(4) * g; /* エラー、単位が違う */

899 :デフォルトの名無しさん:04/04/26 00:06
あ〜、なるほど。単位系で次元を指定しているのですね。
分かりました。有難うございます。

900 :デフォルトの名無しさん:04/04/26 18:21
へー、このテンプレート素晴らしいなあ。
いい事教えてもらった。ありがと。

901 :デフォルトの名無しさん:04/04/27 19:45
boostのビルド方法を教えてください。
環境は、Visual C++ 7.1 + STLport 4.6.2。
これでboost 1.31.0をビルド・インストールしようとしています。

以下のように一部書き換えたvsvars32.batを実行して、
------------------------------------------------------
@set STLPORT_PATH=C:\STLport-4.6.2
@set STLPORT_VERSION=4.6.2
@set INCLUDE=%MSVCDir%\INCLUDE\stlport;%MSVCDir%\ATLMFC\INCLUDE;
%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include\prerelease;
%MSVCDir%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
@set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;
%MSVCDir%\PlatformSDK\lib\prerelease;%MSVCDir%\PlatformSDK\lib;
%FrameworkSDKDir%\lib;%LIB%
------------------------------------------------------

bjam "-sTOOLS=vc7.1-stlport"
"-sBUILD=debug release <runtime-link>static/dynamic
<threading>multi <stlport-version>4.6.2"
"--without-python"

とやると、regex以外はビルドに成功するのですが、

902 :デフォルトの名無しさん:04/04/27 19:45
ライブラリファイルをインストール後、
http://www.kmonos.net/alang/boost/classes/posix_time.html
記載のコードが、LNK2019エラーとなって
ビルドできません。

date_timeのビルドでエラーは出ないものの、
どうも、time_from_string()など、
一部の関数がライブラリファイルに含まれていないようです。

どなたか、同じ環境で正常にビルドできた方、
ビルド方法を教えて頂けるとありがたいのですが。

903 :デフォルトの名無しさん:04/04/27 21:25
>>902
ライブラリファイル自体を個別にリンク指定しないとリンク自体されんよ。

904 :デフォルトの名無しさん:04/04/27 23:22
アルゴリズムで関数オブジェクトを多用し始めると、どうしても
標準C++のアダプタだけでは飽き足らなくなり、boostに手を
染めるというありきたりな結果に。でもいいや、boostはやめられん。

905 :デフォルトの名無しさん:04/04/28 02:29
>>901
> @set STLPORT_PATH=C:\STLport-4.6.2

そのインストール場所なら、STLPORT_PATHはC:が正しい。
tools/build/v1/stlport.jam の get-stlport-root に付いてるコメント見れ。

906 :901:04/04/28 20:14
>>905
おかげさまでうまくビルドできました。
有り難うございます。

VSVARS32.BATを以下のように書き換える。

@set STLPORT_PATH=C:
@set STLPORT_4.6.2_PATH=C:\STLport-4.6.2
@set STLPORT_VERSION=4.6.2
@set INCLUDE=%MSVCDir%\INCLUDE\stlport;
    %MSVCDir%\ATLMFC\INCLUDE;%MSVCDir%\INCLUDE;
    %MSVCDir%\PlatformSDK\include\prerelease;
    %MSVCDir%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
@set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;
    %MSVCDir%\PlatformSDK\lib\prerelease;%MSVCDir%\PlatformSDK\lib;
    %FrameworkSDKDir%\lib;%LIB%

bjamのコマンド。

bjam "-sTOOLS=vc7.1-stlport"
     "-sBUILD=debug release <runtime-link>static/dynamic <threading>multi"
     install "--without-python"

>>903
リンクはちゃんとしていました・・・。

907 :デフォルトの名無しさん:04/04/28 22:07
http://page4.auctions.yahoo.co.jp/jp/auction/d47227135

908 :デフォルトの名無しさん:04/04/28 23:57
>>907
よくわからないけど、違法コピーのアドバイス入れておきましたよ。

909 :デフォルトの名無しさん:04/04/29 17:51
std::list< std::vector<T> >みたいなコンテナってないですかね?

at(pos)が 平均pos/VECTORSIZEで行われて、
erase(it)が、平均 N/(2*2VECTORSIZE)で行われる感じで。

std::dequeみたいな感じですが、dequeはeraseにO(N)かかってしまう
(かわりにatはO(1)で終わる)のでちょっと違うわけです。

910 :デフォルトの名無しさん:04/04/29 17:57
>>909
SGI 版 STL の rope みたいなの?


911 :デフォルトの名無しさん:04/04/29 18:02
コンテナとして定義しようと思ったら計算量がうさんくさいし、insertしたときの挙動もあやしい。
それに std::list< std::vector<T> > と書いた時点で簡単に実装できることが予想できる。

ないでしょうね。

912 :デフォルトの名無しさん:04/04/29 20:30
任意の長さの文字列リテラルを渡し、そのリテラルの各文字のASCII値の合計をcompile-timeに計算して
返すような関数テンプレートって実現できるでしょうか?

1. マクロはなるべく使わない(もしどうしても使うならBoost.Preprocessorで簡潔に)
2. 文字列長は最長32で文字程度に制限してもOK
3. アセンブリリスト上でループ処理に展開されているのはNG, mov $256, %eax みたいに即値になってるのキボン

って感じで考えているんですが、どうも私の書くコード(テンプレートで再帰)はg++ -Sするとループ処理に展開
されちゃってまして、即値になるようなコードが思いつかず難航してます。お知恵を拝借したく。

g++ 3.3.x を使ってます。


913 :デフォルトの名無しさん:04/04/29 20:44
>>912
コンパイル時に文字列リテラルから文字コードの値を取り出すことすらできないんじゃないの?
そのうえ制限つけちゃなおさら無理だろ。

914 :デフォルトの名無しさん:04/04/29 20:52
>>913
いや文字の値を取り出すことくらいはできるだろ。例えば

template<int LEN> inline int Foo(const char (&s)[LEN]) {
return s[0] + s[1] + s[2];
}

は恐らく
> mov $256, %eax みたいに即値になってる
こういう状態になる。LENをつかってねえけどw


915 :デフォルトの名無しさん:04/04/29 21:52
最適化で消えればいいなら、↓でいけるみたい。

#include <cstddef>

template< std::size_t N >
inline int sum( char const (&array)[ N ] )
{
 &sbsp;return sum( reinterpret_cast< char const (&)[ N - 1 ] >( array ) ) + array[ N - 1 ];
}
template<>
inline int sum< 1 >( char const (&array)[ 1 ] )
{
 &sbsp;return array[ 0 ];
}

int f()
{
 &sbsp;return sum("abcdefgasvnljgsthnbdcsxuijbnjikhdljklybuihdmctuldvugn");
}

916 :デフォルトの名無しさん:04/04/29 21:53
ごめん。スペースミスった。

#include <cstddef>

template< std::size_t N >
inline int sum( char const (&array)[ N ] )
{
  return sum( reinterpret_cast< char const (&)[ N - 1 ] >( array ) ) + array[ N - 1 ];
}
template<>
inline int sum< 1 >( char const (&array)[ 1 ] )
{
  return array[ 0 ];
}

int f()
{
  return sum("abcdefgasvnljgsthnbdcsxuijbnjikhdljklybuihdmctuldvugn");
}

917 :デフォルトの名無しさん:04/04/29 21:57
$ g++ -O2 -S -o - 916 && g++ -dumpversion && g++ -dumpmachine
.text
.align 2
.p2align 4,,15
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl $5663, %eax
movl %esp, %ebp
popl %ebp
ret
3.3.1
i686-pc-cygwin

918 :916:04/04/29 22:00
で、特にへんなことはしてないんだが、>>912の書いた「テンプレートで再帰」はなぜループになったんだろう?
もしかして、最適化をかけていなかっただけ?

919 :デフォルトの名無しさん:04/04/29 22:02
>>918
末尾再帰の最適化にでもなったのかも?

920 :912:04/04/30 00:30
>>918
g++って、inlineと明示的に書かないと-O2でもインライン化してくれない
(ことがある?)んですね。そのせいでした。

でも色々参考になりました(reinterpretのとことか)。
ありがとうございました。


921 :デフォルトの名無しさん:04/04/30 00:37
前レスで話題に出てるけど解決してないようなのでもう一度質問させてください。
boostを用いると、VisualStudioのインテリセンス(オートコンプリート)が効きません。(しかし、ものによっては効いたりする)
どうやらうまいことマクロをかいてインテリセンスを騙してやるとうまくいくらしいのですが
それ以上のことが自分の力不足からわかりません。
もしわかる方いらっしゃいましたら教えてもらえませんか(涙

922 :デフォルトの名無しさん:04/04/30 01:15
>>921
インテリセンスなんかに頼るな。

923 :デフォルトの名無しさん:04/04/30 01:22
>>916
inline int sum(char const (&array)[N])

ここ、&無しにできないの?


924 :デフォルトの名無しさん:04/04/30 01:45
>>922
それをいっちゃあおしまいだよ・・・

925 :デフォルトの名無しさん:04/04/30 02:13
>>923
C++Primer第3版P526参照。参照型にしないと、テンプレート引数に
配列の大きさを表す第2引数が必要になる。これは関数内では配列
の大きさを知る事ができないという問題を解決する。但しNが異なる
テンプレートのインスタンスを呼び出すと、その度にインスタンスが
作られてしまう。

本を読むと一種の慣例法のように使うみたいな書き方がしてある。

926 :916:04/04/30 02:14
>>923
int sum<1>(char const array[1]);
int sum<2>(char const array[2]);
とすると、関数の型が両方とも int (char const*) に変換されてしまうので、
template引数の推測などが使えなくなってしまう。

927 :デフォルトの名無しさん:04/04/30 02:19
>>926
そこを何とか・・

928 :916:04/04/30 02:32
>>927
&無しにすることに何の意味があるの?

929 :デフォルトの名無しさん:04/04/30 02:44
>>927
だから配列の大きさを表す第2引数をテンプレート引数に
付け加えるしか手がない。

930 :デフォルトの名無しさん:04/04/30 02:52
こうでもするしかあるまい。54をstrlen()なんかにするとコンパイルが
通らない。

template <std::size_t N>
inline int sum2(char const* array)
{
 return sum2<N - 1>(array + 1) + *array;
}

template <>
inline int sum2<1>(char const* array)
{
 return *array;
}

int f2()
{
 return sum2<54>("abcdefgasvnljgsthnbdcsxuijbnjikhdljklybuihdmctuldvugn");
}

int main()
{
std::cout << f2() << std::endl;
}

931 :デフォルトの名無しさん:04/04/30 08:55
#define SUM2(X) sum2<sizeof(X)-1>(X)
でも足しとけ。

932 :デフォルトの名無しさん:04/04/30 12:42
>>928
いや、つける意味がないからさ、&は。
無駄なものは取りたいじゃない。
過去のしがらみでつけなきゃならんというのは分かった。

933 :デフォルトの名無しさん:04/04/30 17:50
ないの?


934 :デフォルトの名無しさん:04/04/30 18:43
>過去のしがらみでつけなきゃならん
なら、
>つける意味が
「ある」って事やん。

935 :デフォルトの名無しさん:04/04/30 21:42
>>934
厨はいちいち出てくるなよ。

936 :デフォルトの名無しさん:04/04/30 22:48
>>932
いやだから・・・・&は無駄じゃないって。つけないとコンパイル
通らないでしょ?

937 :デフォルトの名無しさん:04/04/30 23:17
>>936
&はシンタックスシュガーなんだからさ…
もういいてば。

938 :デフォルトの名無しさん:04/04/30 23:18
>>937
それは無茶じゃないかな。きみの構文糖の定義は?



939 :デフォルトの名無しさん:04/04/30 23:40
>>937
>&はシンタックスシュガーなんだからさ…
初耳です。&を取って通るコードの例を示して下さい。

940 :デフォルトの名無しさん:04/04/30 23:48
>>937

> 358デフォルトの名無しさん04/04/30 18:42
> gccのoptionてアホだよな

> 359デフォルトの名無しさんsage04/04/30 18:58
> >>358
> 日本語書くときに促音を省略してしまうキミもね。


941 :デフォルトの名無しさん:04/05/01 00:04
個人的には関数テンプレート+最適化で対応するより、スクリプトでも組んでテーブル作るほうが
素直じゃないかと思う。

942 :デフォルトの名無しさん:04/05/01 00:09
>>939
正気ですか。

943 :デフォルトの名無しさん:04/05/01 00:23
>>942
配列の場合は&を付けないとポインタに変換されてしまい、
配列の大きさの推測ができないだろう。それもどうでもいいから
何か例をお願いします。

944 :デフォルトの名無しさん:04/05/01 00:34
>>942
横槍だが、ただ例を出せばいいだけなんじゃねーの?
この手の流れになると突っ込まれた方は必ず逃げるよね。何でだろ?

945 :デフォルトの名無しさん:04/05/01 00:44
>>944
脳内で「できる」と思っていても実際やってみるとコンパイルが
通らず「やーめた」となるからだろう。俺もC++を十分に理解し
ているとは到底言えないが、少なくともコンパイルが通る事を
確認してから発言するようにしている。

946 :デフォルトの名無しさん:04/05/01 00:49
ついに>>945は知能障害を起こしますた。

いいから例を出せってw

947 :デフォルトの名無しさん:04/05/01 00:59
変なのが一匹いるみたいだが放置で。

948 :デフォルトの名無しさん:04/05/01 01:28
>>946
ん?>>945=>>943=>>948ですよ。
>>942が早く例を出してくれるのを待ってるんですが。

949 :デフォルトの名無しさん:04/05/01 01:55
バカっぽいな。

950 :デフォルトの名無しさん:04/05/01 02:03
>>946=>>949恥ずかしいのかな?失敗は誰にもあるよ。気にすんな。


951 :デフォルトの名無しさん:04/05/01 02:05
&の意味も知らずに可哀想。

952 :デフォルトの名無しさん:04/05/01 02:17
お前ら、もちつけ。
釣られるやつも釣る奴と同レベルだぞ。
荒らしに脊髄反射してるのも荒らしと大して変わらんことに気づけ。


953 :デフォルトの名無しさん:04/05/01 02:20
&は山椒

954 :デフォルトの名無しさん:04/05/01 02:32
鰻丼に山椒かける?

955 :デフォルトの名無しさん:04/05/01 02:42
かけるよ

template/* ここスペース入れる?俺は入れるんだけど */<...>

956 :デフォルトの名無しさん:04/05/01 04:15
>>954
で、鰻以外の何に山椒かける?

957 :デフォルトの名無しさん:04/05/01 06:10
>>956
麦茶に混ぜると美味しいよ。

958 :デフォルトの名無しさん:04/05/01 12:19
>>955
そこに入れるということは、
int main (int argc, char *argv[]);
とか書くのか?やめてくれ....orz

959 :デフォルトの名無しさん:04/05/01 13:21
>955
俺はスペース一個入れる

>958
誤爆?勘違い?
テンプレートクラス/関数を書く時のスタイルの話だよ?


960 :デフォルトの名無しさん:04/05/01 14:38
>>955
俺は入れないなあ。
理由聞かれても困るけど、少なくとも>>958みたいなことは全然考えてないよ。

961 :デフォルトの名無しさん:04/05/01 14:44
templateと<の間に空白があるってのは、
属性として密接に関連付いた記号なのに分離されてる感じで違和感が・・
>>958もそうだし、あと配列変数名と [ の間が開いたときも同じように気になりそう。

962 :デフォルトの名無しさん:04/05/01 14:47
んじゃ、
for/* ここにはスペース入れる? */(;;)
if/*ここはどうよ?*/()

漏れは、
template< typename HOGE > class AGE {};
for ( ; ; ) {}
if () {}

963 :デフォルトの名無しさん:04/05/01 14:52
俺はこう

template<typename HOGE>
class AGE
{
};

for (i=0; i<10; ++i)
{
}

if (hoge > fuga)
{
}


964 :デフォルトの名無しさん:04/05/01 14:59
吾亦紅

965 :955(いいだしっぺ):04/05/01 16:33
俺はこう

template <typename HOGE>
class AGE {
  ...
public:
  ...
};

for (i = 0; i < 10; ++i) {
  ...
}

if (hoge > fuge) {
  ...
}

int* piyo(const char* foo, double baz)
{
  ...
}

966 :デフォルトの名無しさん:04/05/01 17:03
俺はこう
template<typename HOGE>
class AGE{
・・・
}
;

for(
  i=0;
  i<10;
  ++i
){
・・・
}

if(
  hoge > fuga
){
・・・
}

289 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)