// Showing how the use of template template parameters is probably
// the most robust solution.
// DD
//
#include <iostream>
#include <complex>
template < typename T>
struct GBM
{
T operator ( ) ( ) const
{
return T( - 1 ) ;
}
} ;
template < typename T>
struct Jump
{
T operator ( ) ( ) const
{
return T( 99999 ) ;
}
} ;
template < typename T, template < typename T> class SDE>
struct FDM
{
T operator ( ) ( ) const
{
SDE< T> sde;
return T( 0.01 ) * sde( ) ;
}
} ;
template < typename T, template < typename T> class SDE, template < typename T, template < typename T> class SDE> class FDM>
struct FDM_II
{
FDM_II( ) { }
T operator ( ) ( ) const
{
SDE< T> sde;
FDM< T, SDE> fdm;
return fdm( ) * sde( ) ;
}
} ;
template < typename T, typename SDE, typename FDM>
struct FDM_NOT_II
{
FDM_NOT_II( ) { }
T operator ( ) ( ) const
{
SDE< T> sde;
FDM< T, SDE> fdm;
return fdm( ) * sde( ) ;
}
} ;
int main( )
{
FDM< double , GBM> mySolver;
std:: cout << mySolver( ) << std:: endl ;
FDM< double , Jump> mySolver2;
std:: cout << mySolver2( ) << std:: endl ;
// The best solution IMO
FDM_II< float , GBM, FDM> fdmII;
FDM_II< std:: complex < int > , Jump, FDM> fdmIIA;
std:: cout << "last one: " << fdmIIA( ) << std:: endl ;
// Old style way and incorrect, but compiles.
FDM_NOT_II< std:: complex < int > , Jump< double > , FDM< int , GBM>> fdmIIB;
// Correct way the old way
FDM_NOT_II< std:: complex < int > , Jump< std:: complex < int >> , FDM< std:: complex < int > , GBM>> fdmIIC;
return 0 ;
}
Ly8gU2hvd2luZyBob3cgdGhlIHVzZSBvZiB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGlzIHByb2JhYmx5Ci8vIHRoZSBtb3N0IHJvYnVzdCBzb2x1dGlvbi4KLy8gREQKLy8KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y29tcGxleD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0cnVjdCBHQk0KewogICAgIFQgb3BlcmF0b3IgKCkgKCkgY29uc3QKICAgICB7CiAgICAgICAgICByZXR1cm4gVCgtMSk7CiAgICAgfQp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICBzdHJ1Y3QgSnVtcAp7CiAgICAgVCBvcGVyYXRvciAoKSAoKSBjb25zdAogICAgIHsKICAgICAgICAgIHJldHVybiBUKDk5OTk5KTsKICAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERT4KICAgICBzdHJ1Y3QgRkRNCnsKICAgICBUIG9wZXJhdG9yICgpKCkgY29uc3QKICAgICB7CiAgICAgICAgICBTREU8VD4gc2RlOwogICAgICAgICAgcmV0dXJuIFQoMC4wMSkqc2RlKCk7CiAgICAgfQp9OwogICAgIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERSwgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERT4gY2xhc3MgRkRNPgogICAgIHN0cnVjdCBGRE1fSUkKewogICAgIEZETV9JSSgpIHt9CiAgICAgVCBvcGVyYXRvciAoKSgpIGNvbnN0CiAgICAgewogICAgICAgICAgU0RFPFQ+IHNkZTsKICAgICAgICAgIEZETTxULCBTREU+IGZkbTsKCiAgICAgICAgICByZXR1cm4gZmRtKCkqc2RlKCk7CiAgICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFNERSwgdHlwZW5hbWUgRkRNPgogICAgIHN0cnVjdCBGRE1fTk9UX0lJCnsKICAgICBGRE1fTk9UX0lJKCkge30KICAgICBUIG9wZXJhdG9yICgpKCkgY29uc3QKICAgICB7CiAgICAgICAgICBTREU8VD4gc2RlOwogICAgICAgICAgRkRNPFQsIFNERT4gZmRtOwoKICAgICAgICAgIHJldHVybiBmZG0oKSpzZGUoKTsKICAgICB9Cn07CmludCBtYWluKCkKewogICAgIEZETTxkb3VibGUsIEdCTT4gbXlTb2x2ZXI7CiAgICAgc3RkOjpjb3V0IDw8IG15U29sdmVyKCkgPDwgc3RkOjplbmRsOwoKICAgICBGRE08ZG91YmxlLCBKdW1wPiBteVNvbHZlcjI7CiAgICAgc3RkOjpjb3V0IDw8IG15U29sdmVyMigpIDw8IHN0ZDo6ZW5kbDsKCiAgICAgLy8gVGhlIGJlc3Qgc29sdXRpb24gSU1PCiAgICAgRkRNX0lJPGZsb2F0LCBHQk0sIEZETT4gZmRtSUk7CiAgICAgRkRNX0lJPHN0ZDo6Y29tcGxleDxpbnQ+LCBKdW1wLCBGRE0+IGZkbUlJQTsKICAgICBzdGQ6OmNvdXQgPDwgImxhc3Qgb25lOiAiIDw8IGZkbUlJQSgpIDw8IHN0ZDo6ZW5kbDsKCiAgICAgLy8gT2xkIHN0eWxlIHdheSBhbmQgaW5jb3JyZWN0LCBidXQgY29tcGlsZXMuCiAgICAgRkRNX05PVF9JSTxzdGQ6OmNvbXBsZXg8aW50PiwgSnVtcDxkb3VibGU+LCBGRE08aW50LCBHQk0+PiBmZG1JSUI7CgogICAgIC8vIENvcnJlY3Qgd2F5IHRoZSBvbGQgd2F5CiAgICAgRkRNX05PVF9JSTxzdGQ6OmNvbXBsZXg8aW50PiwgSnVtcDxzdGQ6OmNvbXBsZXg8aW50Pj4sIEZETTxzdGQ6OmNvbXBsZXg8aW50PiwgR0JNPj4gZmRtSUlDOwoKICAgICByZXR1cm4gMDsKfQoK
compilation info
prog.cpp: In member function 'T FDM_NOT_II<T, SDE, FDM>::operator()() const':
prog.cpp:54:11: error: 'SDE' is not a template
prog.cpp:55:11: error: 'FDM' is not a template
stdout