我如何为std :: string专门化这个类模板?

时间:2012-07-20 22:41:07

标签: c++ templates variadic-templates template-meta-programming

我正在编写一个TMP,使用可变参数模板计算传递给struct的元素数作为模板参数。这是我的代码:

template<class T, T... t>
struct count;

template<class T, T h, T... t> 
struct count<T, h, t...>{
 static const int value = 1 + count<T, t...>::value;
};

template<class T>
struct count<T>{
 static const int value = 0;
};

template<>
struct count<std::string, std::string h, std::string... l>{
 static const int value = 1 + count<std::string, l...>::value;
};

template<>
struct count<std::string>{
 static const int value = 0;
};

int main(){
 std::cout << count<int, 10,22,33,44,56>::value << '\n';
 std::cout << count<bool, true, false>::value << '\n';
 std::cout << count<std::string, "some">::value << '\n';
 return 0;

}

我在使用count的{​​{1}}的第三次实例化时收到错误,因为std::string告诉我g++ 4.7。对此有何解决方法?

2 个答案:

答案 0 :(得分:2)

问题不是std::string类型,而是通话中的文字"some"

std::cout << count<std::string, "some">::value << '\n';

不幸的是,无法将字符串或浮点字面值传递给模板,因为它也是in this answerin that one

答案 1 :(得分:1)

很抱歉让你失望,但没有办法解决这个问题。非类型模板参数只能是基本类型,例如:

  • 整数或枚举
  • 指向对象的指针或指向函数的指针
  • 对象的引用或对函数的引用
  • 指向成员的指针

std::string或其他类型根本无法在那里工作。