Довольно сложно предложить полное решение, не зная, что вы хотите сделать для основных типов. Однако в глубине души я предлагаю вам использовать черту типа std::is_fundamental
.
Если вы хотите, чтобы целые коллекции функций-членов существовали только условно, возможно, одна из них заключается в том, чтобы объединить их в класс помощника-члена:
#include <vector>
#include <type_traits>
#include <cstddef>
class Bar
{
public:
float getMyFloat() const { return 42.5; }
};
template< typename T >
class V
{
private:
static const bool m_primitive = std::is_fundamental<T>::value; // convenience
template <bool B, typename U> struct Helper;
template <typename U> struct Helper<false, U>
{
typedef float (T::*GetterFnType)() const;
void getCalc(std::vector<double> & v1, std::vector<U> const & v2, GetterFnType f)
{
v1.clear();
for (std::size_t i = 0; i < v2.size(); ++i)
v1.push_back((v2[i].*f)());
}
};
public:
// use Helper<m_primitive, T>::GetterFn and Helper<m_primitive, T>::getCalc() here
private:
std::vector<T> m_v;
};
int main(int argc, char** argv)
{
V<Bar> vb; // ok
V<double> vd; // compiler also happy
}
Вам, вероятно, также придется сделать std::enable_if
в реальной реализации. Если вы разместите более подробную информацию, мы можем уточнить.
Если вы открыты для более широкой редизайн, ответ Конрада кажется, что конечный результат будет несколько чище и проще, но опять же я все в пользу извилистого шаблона voodoo: -)