İçinde bir yerde, aşağıdaki kodu olan bir C ++ kitaplığı ( strf ) kullanıyorum :
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) { /* ... */ }
}
Şimdi, kodumda kullanmak istiyorum strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
. Ancak bunu yaparsam, aşağıdaki hatayı alıyorum (CUDA 10.1'in NVCC'sinde):
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)
Kütüphane kod muhtemelen bu (örn kullanmaktan kaçınmak için değiştirilebilir:
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)
sağlamak Range
için bir işaretçi değildir); ama şu anda bu değişikliği yapamam. Bunun yerine, bir şekilde derleyiciye gerçekten bir tane şablon argümanı olduğunu, bir tanesi belirtilmediğini ve diğeri çıkartıldığını gerçekten belirtmek istiyorum.
Bunu yapabilir miyim?
C ++ 11 ve C ++ 14 için cevapları takdir eder; Kesinti rehberlerini içeren C ++ 17 cevapları daha az önemlidir, ancak varsa, lütfen gönderin (gelecekteki NVCC sürümleri için ...)
Güncelleme: strf kütüphanesinin kendisi bu durumu atlatmak için güncellendi, ancak soru sorulduğu gibi duruyor.
char*
ama biri değil bir çözüm değil özel bir yineleyici geçen tahmin ediyorum ?