Skip to content

Commit 17e15f5

Browse files
committed
Add caster_odr_decltype.
Models pybind11_select_caster (pybind/pybind11#3931) instead of the older type_caster specialization mechanics.
1 parent a59c334 commit 17e15f5

File tree

6 files changed

+76
-0
lines changed

6 files changed

+76
-0
lines changed

caster_odr_decltype/car.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "engine.h"
2+
3+
namespace vehicles {
4+
5+
struct vehicle;
6+
7+
struct car_specs {
8+
int power() const { return 100; }
9+
};
10+
11+
car_specs engine_select_specs(vehicle *);
12+
13+
} // namespace vehicles
14+
15+
int car_power() { return engine::power<vehicles::vehicle>(); }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
cl car.cc truck.cc vehicle_specs.cc /Fe"show.exe"
2+
.\show
3+
cl truck.cc car.cc vehicle_specs.cc /Fe"show.exe"
4+
.\show
5+
cl /DUSE_UNIQUE_TO_TRANSLATION_UNIT car.cc truck.cc vehicle_specs.cc /Fe"show.exe"
6+
.\show
7+
cl /DUSE_UNIQUE_TO_TRANSLATION_UNIT truck.cc car.cc vehicle_specs.cc /Fe"show.exe"
8+
.\show
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
set -e
2+
set -x
3+
clang++ -std=c++11 car.cc truck.cc vehicle_specs.cc && ./a.out
4+
clang++ -std=c++11 truck.cc car.cc vehicle_specs.cc && ./a.out
5+
clang++ -std=c++11 -DUSE_UNIQUE_TO_TRANSLATION_UNIT car.cc truck.cc vehicle_specs.cc && ./a.out
6+
clang++ -std=c++11 -DUSE_UNIQUE_TO_TRANSLATION_UNIT truck.cc car.cc vehicle_specs.cc && ./a.out
7+
rm a.out

caster_odr_decltype/engine.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace engine {
2+
3+
#ifdef USE_UNIQUE_TO_TRANSLATION_UNIT
4+
5+
namespace {
6+
struct unique_to_translation_unit {};
7+
} // namespace
8+
9+
#define TTT template <typename T, typename U = unique_to_translation_unit>
10+
11+
#else
12+
13+
#define TTT template <typename T>
14+
15+
#endif
16+
17+
TTT using make_specs = decltype(engine_select_specs(static_cast<T *>(nullptr)));
18+
19+
TTT int power() { return make_specs<T>().power(); }
20+
21+
} // namespace engine

caster_odr_decltype/truck.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "engine.h"
2+
3+
namespace vehicles {
4+
5+
struct vehicle;
6+
7+
struct truck_specs {
8+
int power() const { return 300; }
9+
};
10+
11+
truck_specs engine_select_specs(vehicle *);
12+
13+
} // namespace vehicles
14+
15+
int truck_power() { return engine::power<vehicles::vehicle>(); }

caster_odr_decltype/vehicle_specs.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <iostream>
2+
3+
int car_power();
4+
int truck_power();
5+
6+
int main() {
7+
std::cout << "car power: " << car_power() << std::endl;
8+
std::cout << "truck power: " << truck_power() << std::endl;
9+
return 0;
10+
}

0 commit comments

Comments
 (0)