1

我需要一个类型特征来将输入转换为字符串或双精度。现在我有这样的事情:

template<typename T> struct SH_trait{ };
template<> struct SH_trait<float>{ typedef double type; };
template<> struct SH_trait<double>{ typedef double type; };
template<> struct SH_trait<char*>{ typedef std::string type; };
template<> struct SH_trait<const char*>{ typedef std::string type; };
template<std::size_t N> struct SH_trait<const char[N]> { typedef std::string type; };
template<std::size_t N> struct SH_trait<char[N]> { typedef std::string type; };
template<> struct SH_trait<std::string>{ typedef std::string type; };
template<> struct SH_trait<TString>{ typedef std::string type; };

我用它作为

void f(T input) {
  SH_trait<T>::type myvalue(input);
  Class template_class(myvalue);
  ...
}

我这样做是因为 template_class 仅适用于doubleand string

关键是:假设用户使用例如int. 我想将其转换为双精度,所以我必须添加另一行。是否可以编写更通用的内容来涵盖所有情况?

没有c++11,没有boost,只有c++03

4

3 回答 3

0
template<class T> 
struct SH_trait {
   typedef
   std::conditional<
       std::is_convertible<T,double>::value,
       double,
       std::string
   >::type 
   type;
}

如果 T 不能转换为 double 和 std::string,你想如何处理大小写?

于 2013-07-22T02:44:14.603 回答
0

您可以实现具有std::stringtypedef 的基本模板。然后您可以使用 SFINAE 专门针对所有其他整数类型:

template <typename T, typename = void>
struct SH_trait
{
    typedef std::string type;
};

template <typename T>
struct SH_trait<T, typename std::enable_if<std::is_integral<T>::value>::type>
{
    typedef double type;
};

static_assert( std::is_same<SH_trait<int>::type, double>::value ); // doesn't run

这是一个测试程序。

于 2013-07-21T23:22:23.640 回答
0

您可以检查您的类型是否可以隐式转换为double并使用std::string其他方式:

template<bool isit> struct convertible
{
  typedef std::string type;
};

template<> struct convertible<true>
{
  typedef double type;
};

template<typename T>
void f(T input) 
{
  Class<convertible<std::is_convertible<T, double>::value>::type> template_class(input);
}
于 2013-07-21T23:26:09.420 回答