Как использовать enable_if и специализацию шаблона c ++?

Я пытаюсь использовать enable_if в boost для специализации шаблона, но не могу заставить его работать и не могу понять, как его написать и что на самом деле означает синтаксис. Я прочитал документацию по бусту, но для меня все еще не имеет смысла

У меня есть четыре метода, которые я хочу, чтобы все назывались одинаково, и все они очень похожи. У меня есть две функции, которые будут возвращать строку и две функции, которые будут возвращать целое число.
В каждом случае параметр имеет тип int, int, тип возвращаемого значения или int, const char *, тип возвращаемого значения, поскольку последний параметр будет значением по умолчанию, которое может быть возвращено.

так как то так …

int getVal(int,int,int)
int getVal(int,const char*,int)
string getVal(int,int,string)
string getVal(int,const char*,string)

но это не будет работать, так как параметры одинаковы, и отличается только тип возвращаемого значения, и мне нужно, чтобы он был шаблонным методом, а не просто перегруженным методом. Это в не шаблонном классе. поэтому мне нужно включить enable_if, если возвращаемый тип — строка или целое число, или, возможно, проверить enable_if на последнем параметре?

Буду признателен за любую помощь, если кто-то сможет объяснить, что означает синтаксис и что он на самом деле делает, что будет полезно. Спасибо

это одна из многих попыток получить правильный синтаксис ..

 template<typename myType>
typename enable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);

try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}

template<typename myType>
typename disable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);

try {
CheckColumnType(col, String);
}
catch(DatatableException e){
return d;

}
return this->m_rows[row][col];
}

template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<!T> >::type* dummy = 0){
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}

template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<T> >::type* dummy = 0){

try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}

3

Решение

Я не уверен, если std::enable_if это то, что вы ищете. Вы пытались использовать специализацию шаблонов функций?

template <typename T>
T function(int number, T const& result = T());

template <>
std::string function(int number, std::string const& result)
{
// implementation for T = std::string
return result;
}

template <>
int function(int number, int const& result)
{
// implementation for T = int
return result;
}

Обратите внимание, что для этого требуется C ++ 11. Неопределенность аргументов по умолчанию может быть решена путем явного указания типа, например, int ret = function<int>(1);,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]