How can I detect if a type can be streamed to an std::ostream? sorusunu aktararak, bazı türlerin bir IO akışına aktarılabileceğini söyleyen bir özellik sınıfı yazdım. Özellik, şu ana kadar bir sorun keşfettiğim gibi işe yaramış görünüyor.Neden nvp :: StringRef için özellik şablon sınıf arama operatörüm << yapamıyorum?
LLVM kullanan bir projenin içindeki kodu kullanıyorum ve StringRef sınıfını kullanıyorum (önerilen std :: string_view öğesine benzer). Here, gerekiyorsa bildirim başlığı dosyasını bulabileceğiniz sınıf için Doxygen dokümanı bağlantısıdır. LLVM, StringRef nesnelerini std akışlarına akış yapmak için bir operatör < < sağladığından (özel bir hafif akış sınıfı kullanıyorlar), bir tane yazdım. Ben özelliği kullandığınızda
Ancak sonra benim özel operatör < < ilan edilirse özelliği (Bir başlığındaki özellik ve operatörü diğerinde < < işlevi var çünkü bu olur) çalışmıyor . Şablon örneklemlerindeki arayışın, örnekleme noktasının bakış açısından çalıştığını düşünürdüm, bu yüzden işe yarayacağını düşündüm. Aslında, aşağıda gördüğünüz gibi, başka bir sınıf ve özel operatörün özelliğinden sonra bildirilen özel bir işleçle < <, her şey beklendiği gibi çalışır (bu yüzden şimdi bu sorunu keşfettim), bu yüzden StringRef'i neyin kastettiğini anlayamıyorum özel. Ben özellik bildirimi önce StringRef için operatör < < ilanını taşırsanız
false
true
:
beklentilerimin aksine#include <iostream>
#include "llvm/ADT/StringRef.h"
// Trait class exactly from the cited question's accepted answer
template<typename T>
class is_streamable
{
template<typename SS, typename TT>
static auto test(int)
-> decltype(std::declval<SS&>() << std::declval<TT>(),
std::true_type());
template<typename, typename>
static auto test(...) -> std::false_type;
public:
static const bool value = decltype(test<std::ostream,T>(0))::value;
};
// Custom stream operator for StringRef, declared after the trait
inline std::ostream &operator<<(std::ostream &s, llvm::StringRef const&str) {
return s << str.str();
}
// Another example class
class Foo { };
// Same stream operator declared after the trait
inline std::ostream &operator<<(std::ostream &s, Foo const&) {
return s << "LoL\n";
}
int main()
{
std::cout << std::boolalpha << is_streamable<llvm::StringRef>::value << "\n";
std::cout << std::boolalpha << is_streamable<Foo>::value << "\n";
return 0;
}
, bu baskılar:
Bu tam bir örnektir , doğru yazdırır. Peki bu garip şey neden oluyor ve bu sorunu nasıl düzeltebilirim?
Operatörünüzü, ADL'yi etkinleştirmek için türüyle aynı ad alanına koyun. – Yakk
@Yakk Cevap bu, neden bir tane yazmıyorsunuz? – jrok
@jrok bebeğim, kestirmek için uyumak için bebeğim koydum, ve bunu kontrol etmek zor değil, gerçek problem ve detaylandırma vb. :) – Yakk