// Showing how the use of template template parameters is probably
// the most robust solution.
// DD
//
#include <iostream>
#include <complex>
#include <memory>
#include <vector>
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();
}
};
int main()
{
FDM<double, GBM> mySolver;
std::cout << mySolver() << std::endl;
FDM<double, Jump> mySolver2;
std::cout << mySolver2() << std::endl;
FDM<double, std::allocator> mySolver3;
std::cout << mySolver() << std::endl;
FDM_II<float, GBM, FDM> fdmII;
std::cout << "fdmII: " << fdmII() << std::endl;
FDM_II<std::complex<int>, Jump, FDM> fdmIIA;
std::cout << "fdmIIA: " << fdmIIA() << std::endl;
FDM_II<std::vector<double>, std::allocator, FDM> fdmIIB;
//std::cout << "fdmIIB: " << fdmIIB() << std::endl;
return 0;
}
Ly8gU2hvd2luZyBob3cgdGhlIHVzZSBvZiB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGlzIHByb2JhYmx5Ci8vIHRoZSBtb3N0IHJvYnVzdCBzb2x1dGlvbi4KLy8gREQKLy8KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y29tcGxleD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0cnVjdCBHQk0KewogICAgIFQgb3BlcmF0b3IgKCkgKCkgY29uc3QKICAgICB7CiAgICAgICAgICByZXR1cm4gVCgtMSk7CiAgICAgfQp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICBzdHJ1Y3QgSnVtcAp7CiAgICAgVCBvcGVyYXRvciAoKSAoKSBjb25zdAogICAgIHsKICAgICAgICAgIHJldHVybiBUKDk5OTk5KTsKICAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERT4KICAgICBzdHJ1Y3QgRkRNCnsKICAgICBUIG9wZXJhdG9yICgpKCkgY29uc3QKICAgICB7CiAgICAgICAgICBTREU8VD4gc2RlOwogICAgICAgICAgcmV0dXJuIFQoMC4wMSkqc2RlKCk7CiAgICAgfQp9OwogICAgIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERSwgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNERT4gY2xhc3MgRkRNPgogICAgIHN0cnVjdCBGRE1fSUkKewogICAgIEZETV9JSSgpIHt9CiAgICAgVCBvcGVyYXRvciAoKSgpIGNvbnN0CiAgICAgewogICAgICAgICAgU0RFPFQ+IHNkZTsKICAgICAgICAgIEZETTxULCBTREU+IGZkbTsKCiAgICAgICAgICByZXR1cm4gZmRtKCkqc2RlKCk7CiAgICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICAgRkRNPGRvdWJsZSwgR0JNPiBteVNvbHZlcjsKICAgICBzdGQ6OmNvdXQgPDwgbXlTb2x2ZXIoKSA8PCBzdGQ6OmVuZGw7CgogICAgIEZETTxkb3VibGUsIEp1bXA+IG15U29sdmVyMjsKICAgICBzdGQ6OmNvdXQgPDwgbXlTb2x2ZXIyKCkgPDwgc3RkOjplbmRsOwoKICAgICBGRE08ZG91YmxlLCBzdGQ6OmFsbG9jYXRvcj4gbXlTb2x2ZXIzOwogICAgIHN0ZDo6Y291dCA8PCBteVNvbHZlcigpIDw8IHN0ZDo6ZW5kbDsKCiAgICAgRkRNX0lJPGZsb2F0LCBHQk0sIEZETT4gZmRtSUk7CiAgICAgc3RkOjpjb3V0IDw8ICJmZG1JSTogIiA8PCBmZG1JSSgpIDw8IHN0ZDo6ZW5kbDsKCiAgICAgRkRNX0lJPHN0ZDo6Y29tcGxleDxpbnQ+LCBKdW1wLCBGRE0+IGZkbUlJQTsKICAgICBzdGQ6OmNvdXQgPDwgImZkbUlJQTogIiA8PCBmZG1JSUEoKSA8PCBzdGQ6OmVuZGw7CgogICAgIEZETV9JSTxzdGQ6OnZlY3Rvcjxkb3VibGU+LCBzdGQ6OmFsbG9jYXRvciwgRkRNPiBmZG1JSUI7CiAgICAgLy9zdGQ6OmNvdXQgPDwgImZkbUlJQjogIiA8PCBmZG1JSUIoKSA8PCBzdGQ6OmVuZGw7CgogICAgIHJldHVybiAwOwp9Cgo=