不确定你到底想要什么,但是......我想你可以使用递归和标签类型(比如std::integral_constant<std::size_t, N>,其中N 是Field 的模板参数)来区分getter 和setter在不同的层次。
我的意思是...鉴于以下Field
template <typename T, std::size_t N>
class Field : public Field<T, N-1u>
{
private:
std::string name;
T value;
public:
using Field<T, N-1u>::setField;
using Field<T, N-1u>::getFieldName;
using Field<T, N-1u>::getFieldValue;
using icnc = std::integral_constant<std::size_t, N> const;
virtual void setField (icnc &, std::string const & n0, T const & v0)
{
name = n0;
value = v0;
}
virtual std::string const & getFieldName (icnc &) const
{ return name; }
virtual T const & getFieldValue (icnc &) const
{ return value; }
};
以及定义假方法的地面专业化Field<0>
template <typename T>
class Field<T, 0u>
{
public:
// fake ground functions
virtual void setField () { };
virtual void getFieldName () { };
virtual void getFieldValue () { };
};
如下定义Form
class Form : public Field<int, 10u>
{ };
您有 10 个虚拟 setter 和 20 个(10 个用于名称,10 个用于值)虚拟 getter。
以下是一个完整的工作示例
#include <string>
#include <iostream>
#include <type_traits>
template <typename T, std::size_t N>
class Field : public Field<T, N-1u>
{
private:
std::string name;
T value;
public:
using Field<T, N-1u>::setField;
using Field<T, N-1u>::getFieldName;
using Field<T, N-1u>::getFieldValue;
using icnc = std::integral_constant<std::size_t, N> const;
virtual void setField (icnc &, std::string const & n0, T const & v0)
{
name = n0;
value = v0;
}
virtual std::string const & getFieldName (icnc &) const
{ return name; }
virtual T const & getFieldValue (icnc &) const
{ return value; }
};
template <typename T>
class Field<T, 0u>
{
public:
// fake ground functions
virtual void setField () { };
virtual void getFieldName () { };
virtual void getFieldValue () { };
};
class Form : public Field<int, 3u>
{
// Form inherit three different setField, three different getFieldName
// and three different getFieldValie methods
};
template <std::size_t N>
using tag = std::integral_constant<std::size_t, N> const;
int main ()
{
Form f;
f.setField(tag<1u>{}, "field 1", 111);
f.setField(tag<2u>{}, "field 2", 222);
f.setField(tag<3u>{}, "field 3", 333);
std::cout << f.getFieldName(tag<1u>{}) << ", "
<< f.getFieldValue(tag<1u>{}) << std::endl;
std::cout << f.getFieldName(tag<2u>{}) << ", "
<< f.getFieldValue(tag<2u>{}) << std::endl;
std::cout << f.getFieldName(tag<3u>{}) << ", "
<< f.getFieldValue(tag<3u>{}) << std::endl;
}
在Form 内部工作更多,添加一个模板设置器和几个模板获取器
class Form : public Field<int, 3u>
{
public:
using Field<int, 3u>::setField;
using Field<int, 3u>::getFieldName;
using Field<int, 3u>::getFieldValue;
template <std::size_t N>
using tag = std::integral_constant<std::size_t, N> const;
template <std::size_t N>
void setField (std::string const & n0, int v0)
{ setField(tag<N>{}, n0, v0); }
template <std::size_t N>
std::string const & getFieldName () const
{ return getFieldName(tag<N>{}); }
template <std::size_t N>
int const & getFieldValue () const
{ return getFieldValue(tag<N>{}); }
};
你可以让标签索引的使用更简单
Form f;
f.setField<1u>("field 1", 111);
f.setField<2u>("field 2", 222);
f.setField<3u>("field 3", 333);
std::cout << f.getFieldName<1u>() << ", " << f.getFieldValue<1u>()
<< std::endl;
std::cout << f.getFieldName<2u>() << ", " << f.getFieldValue<2u>()
<< std::endl;
std::cout << f.getFieldName<3u>() << ", " << f.getFieldValue<3u>()
<< std::endl;