0

我想創建一個模板函數,該函數返回intstd::vector<int>,具體取決於模板參數。例如:如何根據模板參數返回不同類型

struct ReturnInt {}; 
struct ReturnVec {}; 

[...] 

int num = func<ReturnInt>(); 
std::vector<int> nums = func<ReturnVec>(); 

我一直試圖天真地實施這個基礎上,我的經驗非常有限的TMP。我覺得它應該包含一些沿着顯式模板專業化,std::enable_ifstd::conditional和/或SFINAE的行。但是我的編碼嘗試都不會編譯,更不用說在簡單的測試中運行了。

這種返回式切換如何實現?

編輯:正如在評論中指出的,這是我的實際問題的簡化。如果有幫助,我有一個接受模板參數的類。根據參數,我希望它的get()方法返回單個對象/值或對象/值的標準容器。

+3

爲什麼功能需要被命名爲相同的,如果他們不義性的基於參數之類的東西?將模板專業化視爲名稱的一部分似乎沒有必要。 –

+0

這是我的實際問題的簡化。如果有幫助,我有一個接受模板參數的類。根據參數,我希望它的'get()'方法返回單個對象/值或標準的對象/值容器。 –

+0

你看過模板專業嗎? –

回答

2

根據您的編輯,你只想要一個沼澤標準模板特

struct ReturnsInt{}; 
struct ReturnsVec{}; 

template<typename T> 
class Foo {}; 

template<> 
class Foo<ReturnsInt> { 
public: 
    int get() { return 3; } 
}; 

template<> 
class Foo<ReturnsVec> { 
public: 
    std::vector<int> get() { 
     return {3}; 
    } 
}; 

如果你只希望修改一個成員函數基於模板,但重用類定義的其餘部分,你可以使用一個輔助類

struct ReturnsInt{}; 
struct ReturnsVec{}; 

class helper_Foo { 
public: 
    string bar() { 
     return "this is a shared method"; 
    } 
}; 

template<typename T> 
class Foo : public helper_Foo {}; 

template<> 
class Foo<ReturnsInt> : public helper_Foo { 
public: 
    int get() { return 3; } 
}; 

template<> 
class Foo<ReturnsVec> : public helper_Foo { 
public: 
    std::vector<int> get() { 
     return {3}; 
    } 
}; 
+0

這工作很好,但這種技術似乎很麻煩,當我有更多的'Foo'單一'get'方法。我無法分享課堂專業化的方法。 –

+1

@BretKuhns:將你的實際類實現放入一個助手類中,並從該助手類派生你的模板類。然後,您可以在模板類中定義'get()'成員函數,並讓其他所有內容來自父類助手類。 –

+0

聰明!這是完美的。謝謝你的幫助! –

相關問題