質問編集履歴

2

リンク貼りわすれ

2018/11/02 06:21

投稿

mitama_rs
mitama_rs

スコア165

test CHANGED
File without changes
test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
 
84
84
 
85
- これは、**range-v3**というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
85
+ これは、[**range-v3**](https://github.com/ericniebler/range-v3/)というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
86
86
 
87
87
  例えば[このソース](https://github.com/ericniebler/range-v3/blob/a2bf5d0596dd2ffc75c2623b62d6226915609622/include/range/v3/view/transform.hpp#L529)にみることができる。
88
88
 

1

yohhoyさんの回答を受けて、こちらでも調べた結果を追記

2018/11/02 06:21

投稿

mitama_rs
mitama_rs

スコア165

test CHANGED
File without changes
test CHANGED
@@ -68,6 +68,54 @@
68
68
 
69
69
 
70
70
 
71
+ ### yohhoyさんの回答を受けて(追記)
72
+
73
+
74
+
75
+ 次のように関数オブジェクトを定義し、その中でオーバーロードを行う。
76
+
77
+ その上で、あらかじめinline変数として関数オブジェクトのインスタンスを作っておく。
78
+
79
+
80
+
81
+ オーバーロードが自然にできるし、関数としても関数オブジェクトとしても使い勝手がいい。
82
+
83
+
84
+
85
+ これは、**range-v3**というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
86
+
87
+ 例えば[このソース](https://github.com/ericniebler/range-v3/blob/a2bf5d0596dd2ffc75c2623b62d6226915609622/include/range/v3/view/transform.hpp#L529)にみることができる。
88
+
89
+ もしかしたらこれが現状(C++17)におけるベストプラクティスなのかもしれないですね。
90
+
91
+
92
+
93
+ ```cpp
94
+
95
+ struct foo_t {
96
+
97
+ // generic version
98
+
99
+ template <class T>
100
+
101
+ T operator()(T a) { return a + a; }
102
+
103
+ // specialized version
104
+
105
+ int operator()(int a) { return a * 10; }
106
+
107
+ };
108
+
109
+
110
+
111
+ inline constexpr auto foo = foo_t{};
112
+
113
+ ```
114
+
115
+
116
+
117
+
118
+
71
119
  ### 試したこと
72
120
 
73
121