質問するログイン新規登録

質問編集履歴

2

リンク貼りわすれ

2018/11/02 06:21

投稿

mitama_rs
mitama_rs

スコア165

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さんの回答を受けて、こちらでも調べた結果を追記

2018/11/02 06:21

投稿

mitama_rs
mitama_rs

スコア165

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
  #### 関数テンプレート