// 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 sde;
FDM 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+IGZkbTsKCiAgICAgICAgICByZXR1cm4gZmRtKCkqc2RlKCk7CiAgICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFNERSwgdHlwZW5hbWUgRkRNPgogICAgIHN0cnVjdCBGRE1fTk9UX0lJCnsKICAgICBGRE1fTk9UX0lJKCkge30KICAgICBUIG9wZXJhdG9yICgpKCkgY29uc3QKICAgICB7CiAgICAgICAgICBTREUgc2RlOwogICAgICAgICAgRkRNIGZkbTsKCiAgICAgICAgICByZXR1cm4gZmRtKCkqc2RlKCk7CiAgICAgfQp9OwppbnQgbWFpbigpCnsKICAgICBGRE08ZG91YmxlLCBHQk0+IG15U29sdmVyOwogICAgIHN0ZDo6Y291dCA8PCBteVNvbHZlcigpIDw8IHN0ZDo6ZW5kbDsKCiAgICAgRkRNPGRvdWJsZSwgSnVtcD4gbXlTb2x2ZXIyOwogICAgIHN0ZDo6Y291dCA8PCBteVNvbHZlcjIoKSA8PCBzdGQ6OmVuZGw7CgogICAgIC8vIFRoZSBiZXN0IHNvbHV0aW9uIElNTwogICAgIEZETV9JSTxmbG9hdCwgR0JNLCBGRE0+IGZkbUlJOwogICAgIEZETV9JSTxzdGQ6OmNvbXBsZXg8aW50PiwgSnVtcCwgRkRNPiBmZG1JSUE7CiAgICAgc3RkOjpjb3V0IDw8ICJsYXN0IG9uZTogIiA8PCBmZG1JSUEoKSA8PCBzdGQ6OmVuZGw7CgogICAgIC8vIE9sZCBzdHlsZSB3YXkgYW5kIGluY29ycmVjdCwgYnV0IGNvbXBpbGVzLgogICAgIEZETV9OT1RfSUk8c3RkOjpjb21wbGV4PGludD4sIEp1bXA8ZG91YmxlPiwgRkRNPGludCwgR0JNPj4gZmRtSUlCOwoKICAgICAvLyBDb3JyZWN0IHdheSB0aGUgb2xkIHdheQogICAgIEZETV9OT1RfSUk8c3RkOjpjb21wbGV4PGludD4sIEp1bXA8c3RkOjpjb21wbGV4PGludD4+LCBGRE08c3RkOjpjb21wbGV4PGludD4sIEdCTT4+IGZkbUlJQzsKCiAgICAgcmV0dXJuIDA7Cn0KCg==