Я пытаюсь решить следующую проблему: я хотел бы сделать оператор if
, который что-то делает в зависимости от того, является ли аргумент шаблона конкретным объектом или нет, и если это так, вызовите функцию-член объекта. Допустим, я хочу std::string
фрагмент:
#include <iostream>
#include <string>
template <typename T>
void is_string(const T& arg) {
if (std::is_same<T, const std::string&>::value)
std::cout << arg.length() << std::endl;
else
std::cout << "The argument is not a string" << std::endl;
}
int main() {
is_string(0);
return 0;
}
Не компилируется со следующей ошибкой:
types.cpp: In instantiation of ‘void is_string(const T&) [with T = int]’:
types.cpp:13:13: required from here
types.cpp:7:13: error: request for member ‘length’ in ‘arg’, which is of non-class type ‘const int’
std::cout << arg.length() << std::endl;
Я считаю, что то, чего я пытаюсь достичь, может оказаться невозможным в С++ 11, но я был бы признателен за некоторые предложения о том, как это сделать.