web-dev-qa-db-ja.com

C ++が2番目のテンプレート引数を推測しないようにするにはどうすればよいですか?

私はC++ライブラリ( strf )を使用していますが、その中には、次のコードが含まれています。

_namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }

template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
_

ここで、コードでstrf::range<const char*>(some_char_ptr, some_char_ptr + some_length)を使用します。しかし、そうすると、次のエラーが発生します(CUDA 10.1のNVCCを使用)。

_error: more than one instance of overloaded function "strf::range" matches the argument list:
            function template "auto strf::range(ForwardIt, ForwardIt)"
            function template "auto strf::range(const Range &, const CharT *)"
            argument types are: (util::constexpr_string::const_iterator, util::constexpr_string::const_iterator)
_

libraryコードはおそらくこれを回避するために変更できます(たとえば、次のように使用します:

_inline auto range(const typename std::enable_if<not std::is_pointer<typename std::remove_cv<Range>::type>::value, Range &>::type range, const CharT* sep)
_

Rangeがポインタでないことを確認するため);今は変更できません。代わりに、テンプレート引数を1つだけ指定し、1つは指定せず、もう1つは演繹しないことをコンパイラーに何らかの方法で示す必要があります。

それをしてもいいですか?

C++ 11とC++ 14の回答をいただければ幸いです。控除ガイドを含むC++ 17の回答はそれほど重要ではありませんが、ある場合は投稿してください(将来のNVCCバージョンの場合...)


Update:この状況を回避するためにstrfライブラリ自体が更新されましたが、質問は尋ねられたとおりです。

26
einpoklum

解決策は

1)まず最初に、2番目の引数のタイプを指定する必要があります。 (char *)(some_char_ptr + some_length)

2)両方にconstを使用しないでください。これは適切に機能します。

strf::range((char *)some_char_ptr, (char *)(some_char_ptr + some_length));

左側の(char *)(const char *)で置き換えることを試みることができますOR右側)、まだ機能します。

0
tontonCD