2016-11-15 32 views
8

我有一組對模板類工作的功能,但不依賴於類的模板部分。C++函數的結構,無論模板類型

模板功能,並允許它來推斷類型的工作,但隨後會編譯成多種功能。

#include <iostream> 

template<typename T> 
struct MyStruct { 
    int a; 
    T b; 
}; 


bool isLess(MyStruct& lhs, MyStruct& rhs) { 
    return lhs.a < rhs.a; 
} 


int main(int argc, char const *argv[]) 
{ 
    MyStruct<int> x {123, 456}; 
    MyStruct<int> y {789, 123}; 

    std::cout << isLess(x, y) << std::endl; 

    return 0; 
} 

有沒有辦法做到這一點?

+0

如果你定義的類聲明中成員函數,你並不需要包括任何模板參數,如果他們不改變。 –

回答

12

重構不另一個類取決於T領域。請從中MyStruct<T>繼承:

struct MyStructBase 
{ 
    int a; 
}; 

template<typename T> 
struct MyStruct : MyStructBase 
{ 
    T b; 
}; 

bool isLess(MyStructBase& lhs, MyStructBase& rhs) { 
    return lhs.a < rhs.a; 
} 

int main(int argc, char const *argv[]) 
{ 
    MyStruct<int> x {123, 456}; 
    MyStruct<int> y {789, 123}; 

    std::cout << isLess(x, y) << std::endl; 

    return 0; 
} 
9

您可以使用繼承:

struct MyStructBase { 
    int a; 
}; 

template<typename T> 
struct MyStruct : public MyStructBase { 
    T b; 
}; 


bool isLess(MyStructBase& lhs, MyStructBase& rhs) { 
    return lhs.a < rhs.a; 
} 
1

我會做到這一點:

​​

這不管你的工作類型之間的關係,並會沒有編譯成多功能(見最後一段)。它將允許任何類型的成員a小於可比。

對函數進行模板化並允許它推導出類型,但是會編譯爲多個函數。

不好猜測。它甚至比這更好,它將編譯爲沒有任何功能,因爲任何理智的編譯器(甚至是msvc)都將完全內聯該函數。

+0

非常簡潔的解決方案! OP應該接受它。 _ 「甚至MSVC」 _ LOL:d –

+0

你的回報說法是錯誤的(R,而不是L用左)。 – overseas

+0

哎呀,對不起,讓我解決這個問題。 –

相關問題