00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __ONLY_FOR_HH
00018 # define __ONLY_FOR_HH
00019
00020 # include "../failure.hh"
00021
00022 namespace aurelia {
00023
00024 template <typename Strat, typename T>
00025 struct only_for_strategy {
00026 Strat s;
00027 only_for_strategy(const Strat& s): s(s) {}
00028
00029 T operator()(T&& in) const {
00030 return s(std::move(in));
00031 }
00032
00033 T operator()(const T& in) const {
00034 return s(in);
00035 }
00036
00037 template <typename U>
00038 U operator()(U) const {
00039 throw failure();
00040 }
00041 };
00042
00043 template <typename T>
00044 struct only_for {
00045 template <typename Strat>
00046 only_for_strategy<Strat,T> operator()(const Strat& s) {
00047 return s;
00048 }
00049 };
00050
00051 }
00052
00053 #endif