这是确保隐式类型转换不会发生的合法方法

时间:2014-11-04 01:39:59

标签: c++ c++11

这是否是确保隐式类型转换不会发生的合法方法?

#include <string>
#include <iostream>

void func(std::string s)
{
   std::cout << "Thanks for the string\n";
}
template<class T>
void func(T)=delete;

int main()
{
   func("test1");
// str.cc: In function ‘int main()’:
// str.cc:13:16: error: use of deleted function ‘void func(T) [with T = const char*]’
//     func("test1");
//     ^
//  str.cc:9:6: error: declared here
//  void func(T)=delete;
//       ^
//
   func(std::string("test2"));
   return 0;
}

2 个答案:

答案 0 :(得分:8)

对我来说很好。

答案也是如此。

答案 1 :(得分:1)

是的,该方法可确保不允许隐式转换。但是,这也意味着此属性不是仅由void func(string)的定义引起的。因此,为了向读者阐明这一点,您可以使其更加独立,如下所示:

template <typename T, typename U> using RequireExplicit = enable_if_t<is_same<T, U>>;

template <typename T, typename = RequireExplicit<T, string>>
void func(T){}