我有一個名爲'equal'的函數接受2個參數,它們每個都應該是std :: set或std: :multiset,並且容器的元素類型應該是算術類型(int,float,double ...)。如果上述2個條件不滿足,我希望編譯器報告錯誤。在編譯時檢查是否設置了模板參數類型或multiset,並且容器的元素類型是數學運算
我希望我的代碼可以運行這樣的:
int main(void)
{
std::set<int> s1;
std::set<int> s2;
equal(s1, s2); // OK
std::multiset<float> s3;
std::multiset<float> s4;
equal(s3, s4); // OK
std::set<int> s5;
std::multiset<int> s6;
equal(s5, s6); // compile error
std::set<int*> s7;
std::set<int*> s8;
equal(s7, s8); // compile error
std::vector<int> s9;
std::vector<int> s10;
equal(s9, s10); // compile error
return 0;
}
現在它可以檢查是否元素是算術類型,象下面這樣:
template <class Container, class = typename std::enable_if<std::is_arithmetic<typename Container::value_type>::value>::type>
bool equal(const Container &container1, const Container &container2)
{
return true;
}
但如何確保容器只能是設置還是multiset?
編譯器可以支持C++ 11,如vc2015或gcc4.8
首選'typename std :: enable_if :: type * = nullptr' over'typename = typename std :: enable_if :: type'。用你的方式'等於(42,51);'是有效的,第二點,如果你想禁用部分,你會感到尷尬,因爲默認類型不是簽名的一部分。 –
Jarod42