Talk #3188 » ex4_crtp.cpp
1 |
/*
|
---|---|
2 |
* Created: 04-02-2016
|
3 |
* Modified: Fri 05 Feb 2016 10:52:38 CET
|
4 |
* Author: Jonas R. Glesaaen (jonas@glesaaen.com)
|
5 |
*/
|
6 |
|
7 |
#include<iostream>
|
8 |
|
9 |
template <typename T> |
10 |
class Base |
11 |
{
|
12 |
public:
|
13 |
virtual double foo() |
14 |
{
|
15 |
std::cout << "Casting" << std::endl; |
16 |
return static_cast<T*>(this)->foo(); |
17 |
}
|
18 |
};
|
19 |
|
20 |
class Cl1 : public Base<Cl1> |
21 |
{
|
22 |
public:
|
23 |
double foo() |
24 |
{
|
25 |
return 4; |
26 |
}
|
27 |
};
|
28 |
|
29 |
class Cl2 : public Base<Cl2> |
30 |
{
|
31 |
public:
|
32 |
double foo() |
33 |
{
|
34 |
return 5; |
35 |
}
|
36 |
};
|
37 |
|
38 |
template <typename Type> |
39 |
double call(Base<Type> x) |
40 |
{
|
41 |
return x.foo(); |
42 |
}
|
43 |
|
44 |
int main(int, char**) |
45 |
{
|
46 |
auto x = Cl1 {}; |
47 |
auto y = Cl2 {}; |
48 |
|
49 |
std::cout << call(x) << "\n"; |
50 |
std::cout << call(y) << "\n"; |
51 |
}
|