gpt4 book ai didi

c++ - 是否可以防止此代码出现 "copy and paste similar template special case"?

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:12 25 4
gpt4 key购买 nike

我有一些程序像这样递归地读取 vector :

#define ARRAYTOJSON(x) arrayToJson<decltype(x)>(#x,x)
template<class V>
inline void arrayToJson(const char* c,V& v){
typedef typename V::value_type E;
for(typename std::vector<E>::iterator it=v.begin();it!=v.end();++it){
arrayToJson(c,*it);
}
}

template<>
inline void arrayToJson(const char* c,int& v){
printf("%s %d\n",c,v);
}

int main(){
std::vector<int> v;
v.push_back(5);
ARRAYTOJSON(v);

int i=0;
ARRAYTOJSON(i);
return 0;
}

但现在我想用 test() 方法为 2 个新类添加特殊情况:

class A{
public:
void test(){}
};

class B{
public:
void test(){}
};

我现在需要做的是复制特殊情况并将其放入代码中:

template<>
inline void arrayToJson(const char* c,A& v){
v.test();
}

template<>
inline void arrayToJson(const char* c,B& v){
v.test();
}

是否有任何语法强制特殊情况(如果没有其他特殊情况可以使用)使用通用模板特殊情况,如:

template<>
inline void arrayToJson(const char* c,B& v){
v.test();
}

这样我就不需要为每个类复制和放置每个特殊案例?

最佳答案

您可以编写两个非专用版本,它们根据 V 是否具有名为 test 的成员函数进行标记分派(dispatch):

//you'll need void_t for this
template <typename T, typename=void>
struct has_test : std::false_type{};
template <typename T>
struct has_test<T, void_t<decltype(std::declval<T>().test())>> : std::true_type{};

//base case
template <typename V>
inline void arrayToJson(const char* c, V& v) {
//tag dispatch
arrayToJsonImpl(c,v,has_test<V>{});
}

//int specialization
template <>
inline void arrayToJson(const char* c,int& v){
printf("%s %d\n",c,v);
}

//V does not have test
template<class V>
inline void arrayToJsonImpl(const char* c,V& v,std::false_type){
typedef typename V::value_type E;
for(typename std::vector<E>::iterator it=v.begin();it!=v.end();++it){
arrayToJson(c,*it);
}
}

//V does have test
template <typename V>
void arrayToJsonImpl(const char* c,V& v, std::true_type)
{
(void)c;
v.test();
}

Live demo

关于c++ - 是否可以防止此代码出现 "copy and paste similar template special case"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32179304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com