1

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

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我在with的第三次实例化时收到错误,std::string因为g++ 4.7告诉我error: ‘class std::basic_string<char>’ is not a valid type for a template non-type parameter。有什么解决方法吗?

4

2 回答 2

2

问题不在于类型,而在于您调用中std::string的文字"some"

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

不幸的是,不可能将字符串或浮点文字传递给模板,正如在这个答案那个答案中所写的那样。

于 2012-07-20T23:07:23.413 回答
1

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

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

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

于 2012-07-20T23:05:24.577 回答