我目前正在嘗試用VC++編譯器編譯一個簡單的SFINAE結構。我的(根據CL命令)版本SFINAE與VC++編譯器
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
這個代碼編譯罰款鏗鏘
// Example program
#include <iostream>
#include <string>
#include <typeinfo>
struct spString
{
template <class... T>
spString format(T...) { return spString(); }
const char* c_str() { return nullptr; }
spString operator+(spString) { return spString(); }
spString operator+(const char*) { return spString(); }
};
struct debuggable
{
spString getDebugString() { return spString(); }
};
void fromFloat(spString, float&) {}
void fromInt(spString, int&) {}
template <class T> inline auto from(T v)
-> decltype(v.getDebugString(), spString())
{
return v.getDebugString();
}
template <class T> inline auto from(T v)
-> decltype(v->getDebugString(), spString())
{
spString r;
r.format("%u (%s)", (size_t) v, v->getDebugString().c_str());
return r;
}
template <class T> inline spString from(T v)
{
return spString("(") + typeid(T).name() + " instance)";
}
template <> inline spString from(float _v ) { spString _d; fromFloat (_d, _v); return _d; }
template <> inline spString from(int _v ) { spString _d; fromInt (_d, _v); return _d; }
//other base types
int main()
{
debuggable x{};
from(0);
from(0.f);
from(x);
}
但是無法對微軟的編譯器。 Noe說我不能使用另一個版本,而且我現在正在使用我正在使用的版本。我一直在這個編譯器上減輕了SFINAE的成功,但是我看不到如何輕鬆「修復」這些代碼。
預期的結果是獲得調試字符串表示的東西,如果它有一個getDebugString,則使用此方法,如果它是基本類型,則使用自定義方法,否則僅打印該類型的名稱。
您是否看到過使用我的Visual Studio版本實現這一目標的方法?
這兩個第一次重載的目的是什麼?一個是返回'spString'的方法,另一個是返回'std :: string'的方法? – Holt
它處理的情況下,類型有一個方法getDebugString,並使用它而不是默認的回退方法 – Nyashes
關於編輯:std :: string永遠不會提到,我們不會使用std :: string的一些老的原因。另外一種方法適用於像指向對象的指針或指針,另一種用於指導實例 – Nyashes