我有一個模板類template<typename T> Foo
,它使用了某些功能T
。然而,事實證明,即使沒有T
具有所有必要的成員函數,代碼也可以編譯。一個例子如下。確保C++模板不會編譯時丟失的函數
template<class T>
struct Foo {
T t;
int foo() {
return t.foo();
}
int bar() {
return t.bar();
}
};
struct baz {
int foo() {
return 42;
}
};
int main() {
Foo<baz> x;
return x.foo();
}
我怎樣才能確保代碼不會編譯如果T
不提供所有必要的功能?我知道如果我使用包含所有繼承的基類並從中派生,就可以做到這一點。不過,如果可以在沒有太多附加代碼的情況下使用模板,我將非常感激。
我在Linux上使用gcc 4.8.2。
當代碼編譯,缺少的功能,難言*技術上*必要的。他們在什麼意義上是必要的? –
如果你想玩一些即將到來的C++功能,你可以嘗試[概念](http://isocpp.org/blog/2013/02/concepts-lite-constraining-templates-with-predicates-andrew-sutton-bjarne -s)。 – Cornstalks
在運行代碼的意義上,它們不是「必需的」。但它會很好,因爲有時候我忘了給'T'添加一個函數,然後直到實際使用該函數後才被捕獲。 –