我們有複雜的模板類,它們有一些不適用於特定策略或類型的方法。因此,當我們檢測到這些類型(編譯時,使用類型特徵)時,我們會發出一條帶有好消息的靜態斷言。我可以從手動模板實例化中排除一些方法嗎?
現在我們也做了大量的手動模板實例化。部分原因是這些方法被強制編譯爲語法檢查方法。它還減少了圖書館用戶的編譯時間。問題是靜態斷言總是被觸發,因此我們不能手動實例化模板類。
是否有解決方法?
編輯:使其更清晰,這裏有一個例子(在這種情況下,顯式實例都將失敗someFunc1():
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2:這裏是另一個例子這個時候你可以編譯它明白我的意思。首先馬上編譯,代碼應編譯,然後取消註釋[2]和靜態斷言應該解僱。現在註釋掉[2]和取消註釋[1]。該靜態斷言無線會因爲你明確地實例化模板而着火。我想避免刪除明確的實例化,因爲它帶來的好處(請參閱上面的好處)。
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template <typename T>
class foo
{
public:
void func() {}
void func1() { LOKI_STATIC_CHECK(sizeof(T) == 4, Assertion_error); }
};
template foo<int>;
//template foo<double>; // [1]
int main()
{
foo<int> a;
a.func1();
foo<double> b;
//b.func1(); //[2]
return 0;
}
從描述中不清楚問題是什麼,但從問題的範圍來看,它似乎是enable_if是你的(http://www.boost.org/doc/libs/1_48_0/libs/utility/ enable_if.html) – bobah
@bobah:這根本不是一個壞主意......我會研究它。如果您可以準備一個我可以驗證的簡單示例,我會將其標記爲答案? – Samaursa
我同意那些抱怨缺乏細節的人。但無論如何,這給我敲響了一個鐘聲:「問題是靜態斷言總是被解僱。」 http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html#boost_staticassert.templates,最後一句話:你遇到的問題是什麼? –