所以,如果我想专攻:
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";
答案 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_type
,my_class
应该通过ADL自动获取它。
由于你有一堆私有静态const成员,你也可以将它们全部放入自己的结构中。然后,您可以使用一个函数为给定类型创建所有函数,而不是每个私有静态const成员使用一个函数。