更简洁的模板化私有静态const成员变量特化

时间:2016-03-12 05:43:25

标签: c++ const static-members template-specialization c++17

所以,如果我想专攻:

template<typename T>
class my_class{
       private:
          static const std::string my_string;
        };

我能够做到的唯一方法是通过

template<> const std::string my_class<some_type>::my_string = "the string";

假设我有一堆私有静态成员和一堆特殊化。

有更清洁的方法吗?更接近:

my_class<some_type>::my_string = "the string";

1 个答案:

答案 0 :(得分:1)

一种方法是标签调度。

template<class T> struct tag_t{using type=T;};
template<class T> constexpr tag_t<T> tag={};

auto make_my_string(tag_t<some_type>){return "the string";}

然后:

template<typename T>
class my_class{
private:
  static const std::string my_string;
};

template<class T>
static const std::string my_class<T>::my_string = make_my_string( tag<T> );

每种类型的开销是:

auto make_my_string(tag_t<some_type>){return "the string";}

比替代品更清洁。作为优势,您可以在make_my_string旁边的命名空间中定义some_typemy_class应该通过ADL自动获取它。

由于你有一堆私有静态const成员,你也可以将它们全部放入自己的结构中。然后,您可以使用一个函数为给定类型创建所有函数,而不是每个私有静态const成员使用一个函数。