2016-02-20 86 views
4

想象我有映射實例變量鍵入模板成員函數

struct A { 
template <class T> 
T getFirstElement(); 

vector<float> floatVector; 
vector<int> intVector; 
}; 

在implelemtation文件:

template <> 
float A::getFirstElement<float>() { 
    return floatVector[0]; 
} 

template <> 
int A::getFirstElement<int>() { 
    return intVector[0]; 
} 

因爲我知道我的類型的成員變量,甚至給它們命名,似乎矯枉過正。有什麼辦法可以在編譯時提供一些東西(比如類型列表),這個結構的成員是什麼?想要更簡潔,沒有明確的模板專業化。

+0

爲什麼沒有馬全班王模板?你在問一個XY問題嗎? –

+0

不...這是關於代碼重用訪問成員變量 –

回答

1

你可以寫類似:

#include <vector> 

template<typename T> 
struct VectorProvider 
{ 
    std::vector<T> vector; 

    auto& get() { 
    return vector; 
    } 
}; 

struct A 
    : VectorProvider<float>, VectorProvider<int> { 

template <typename T> 
T getFirstElement() { 
    return VectorProvider<T>::get()[0]; 
} 
}; 

Demo

+0

我也喜歡這個,但我認爲@ jarod42的解決方案更清潔...並且不使用繼承 –

4

隨着std::tuple你可以做

struct A { 
    template <class T> 
    T getFirstElement() const 
    { 
     return std::get<std::vector<T>>(Vectors)[0]; 
    } 

    std::tuple<std::vector<float>, std::vector<int>> Vectors; 
}; 

而且具有可變參數模板:

template <typename ... Ts> 
struct A_impl { 
    template <class T> 
    T getFirstElement() const 
    { 
     return std::get<std::vector<T>>(Vectors)[0]; 
    } 

    std::tuple<std::vector<Ts>...> Vectors; 
}; 

struct A : A_impl<float, int> {}; 
+0

我真的很喜歡這個。我以爲這個元組可以幫忙,確實 –

+0

嗯不起作用?在這兩個解決方案中都沒有用於調用「get」的匹配函數 –

+0

「模板參數無效的候選模板:模板參數的無效顯式指定參數」 –