質問編集履歴
2
リンク貼りわすれ
title
CHANGED
File without changes
|
body
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
オーバーロードが自然にできるし、関数としても関数オブジェクトとしても使い勝手がいい。
|
42
42
|
|
43
|
-
これは、**range-v3**というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
|
43
|
+
これは、[**range-v3**](https://github.com/ericniebler/range-v3/)というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
|
44
44
|
例えば[このソース](https://github.com/ericniebler/range-v3/blob/a2bf5d0596dd2ffc75c2623b62d6226915609622/include/range/v3/view/transform.hpp#L529)にみることができる。
|
45
45
|
もしかしたらこれが現状(C++17)におけるベストプラクティスなのかもしれないですね。
|
46
46
|
|
1
yohhoyさんの回答を受けて、こちらでも調べた結果を追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -33,6 +33,30 @@
|
|
33
33
|
なにか良い方法が無いものでしょうか?
|
34
34
|
やはりプリプロセッサマクロなのでしょうか???
|
35
35
|
|
36
|
+
### yohhoyさんの回答を受けて(追記)
|
37
|
+
|
38
|
+
次のように関数オブジェクトを定義し、その中でオーバーロードを行う。
|
39
|
+
その上で、あらかじめinline変数として関数オブジェクトのインスタンスを作っておく。
|
40
|
+
|
41
|
+
オーバーロードが自然にできるし、関数としても関数オブジェクトとしても使い勝手がいい。
|
42
|
+
|
43
|
+
これは、**range-v3**というC++20に提案されているライブラリの実験的実装でも使われている方法であった。
|
44
|
+
例えば[このソース](https://github.com/ericniebler/range-v3/blob/a2bf5d0596dd2ffc75c2623b62d6226915609622/include/range/v3/view/transform.hpp#L529)にみることができる。
|
45
|
+
もしかしたらこれが現状(C++17)におけるベストプラクティスなのかもしれないですね。
|
46
|
+
|
47
|
+
```cpp
|
48
|
+
struct foo_t {
|
49
|
+
// generic version
|
50
|
+
template <class T>
|
51
|
+
T operator()(T a) { return a + a; }
|
52
|
+
// specialized version
|
53
|
+
int operator()(int a) { return a * 10; }
|
54
|
+
};
|
55
|
+
|
56
|
+
inline constexpr auto foo = foo_t{};
|
57
|
+
```
|
58
|
+
|
59
|
+
|
36
60
|
### 試したこと
|
37
61
|
|
38
62
|
#### 関数テンプレート
|