2016-02-20 87 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

“模板参数无效的候选模板:模板参数的无效显式指定参数” –