前提
using
をテンプレート関数の中に書くことで関数の候補を追加する方法が知られています。
cpp
1#include <type_traits> 2#include <iostream> 3 4namespace ns1 { 5 struct foo{}; 6 foo&& bar(foo&& x) { 7 std::cout << "ns1::bar" << std::endl; 8 return std::move(x); 9 } 10} 11 12namespace ns2 { 13 int bar(int x) { 14 std::cout << "ns2::bar" << std::endl; 15 return x; 16 } 17} 18 19template<class T> 20void baz(T&& obj) { 21 using ns2::bar; // これがあることで baz(123) が通るようになる 22 bar(std::forward<T>(obj)); 23} 24 25int main(void) { 26 baz(ns1::foo()); 27 baz(123); 28 return 0; 29}
しかし、このような using
はあくまでも関数内が影響範囲なので関数の返却値の箇所には関係ありません。
なので、以下のような書き方は出来ません。
cpp
1template<class T> 2auto baz(T&& obj) -> decltype(bar(std::forward<T>(obj))) { 3 using ns2::bar; 4 return bar(std::forward<T>(obj)); 5}
というより、 ns2::bar
が候補にならないので単に baz(123)
と書いている箇所はエラーになってしまいます。
質問
C++11 で上記の例のようなテンプレート関数 baz
をグローバルスコープに書くとき、グローバルスコープで using
をせずに返却値の型の記述の中の bar
に対して ns2::bar
を候補に加える方法はあるでしょうか?
方法が無いと考えるならば無いという回答でも構いません。
注意点
この質問はあくまでも返却値の記述の中に名前候補を追加する方法についてなので返却値の記述自体を避け (たとえば何らかの方法で推論させる等) たり、特殊化やオーバーロードによって個別に対処するような話題を広げる提案はしないでください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。