2015-01-26 113 views
-1

如果我想要为具有匹配接口的两个集合使用复杂的函数(至少就涉及的函数而言),是否有一种方法可以重新使用模板代码?对不同的参数使用相同的模板函数?

例如:

void DoSomethingIntense(std::vector<blah> myBlah); 
void DoSomethingIntense(std::array<blah> myBlah); 

如果使用开始,结束,大小,并且这两个阵列和矢量共同具有的其它功能,是有办法重新使用DoSomethingIntense的主体而无需键入它两次(或者,天堂禁止,把它塞进一个宏)?

(请不要鸡蛋里挑骨头的示例代码,它并不能帮助任何人)

UPDATE:我的道歉,我忘了提及有问题的功能有其他实现方式为不此签名匹配类;只是让每个参数都使用适用于这两个参数的代码不是一个选项。

我认为在这种情况下迭代器解决方案可能是最好的。

+0

是不是你需要的模板函数?我很困惑,因为你的问题包含明显的答案... – 2015-01-26 19:13:26

+0

这不是一个模板函数,但也许它应该是。 – tadman 2015-01-26 19:14:04

回答

1

是的,你可以通过使用模板实现这一目标:

template<typename T> 
void DoSomethingIntense(const T &myBlah); 

编辑:

如果我让你更新正确的话,我会说,化妆用的SFINEA

template<typename T> 
struct is_vector : std::false_type {}; 

template<typename T, typename A> 
struct is_vector<std::vector<T, A>> : std::true_type {}; 

template<typename T> 
struct is_array : std::false_type {}; 

template<typename T, size_t N> 
struct is_array<std::array<T, N>> : std::true_type {}; 

// add more if you want or define a macro 

template<typename T> 
std::enable_if_t<is_vector<T>::value || is_array<T>::value, void> 
DoSomethingIntense(const T &myBlah) 
{ 
} 

int main() 
{ 
    std::vector<int> v; 
    DoSomethingIntense(v); // OK 

    std::array<float, 5> a; 
    DoSomethingIntense(a); // OK 

    std::queue<int> q; 
    DoSomethingIntense(q); // ERROR 
} 
3

是,使用模板。

template <typename Container> 
void DoSomethingIntense(Container blah) { // Might be better as Container const & 
    // write code using blah.begin() or whatever 
} 

您也许能使其更加通用,以下STL的例子,通过支持一般的迭代器区间,而不是专门的容器:

template <typename Iterator> 
void DoSomethingIntense(Iterator begin, Iterator end); 
0

你可以混合模板/过载。没问题。

例如:

template <typename T> 
void DoSomethingIntense(T myBlah) { 

} 

void DoSomethingIntense(MyCustomClass myBlah) { 

} 

然后,它会使用参数类型MyCustomClass和非模板版本的模板版本为别的(如vectorarray

而且,你可以使用std::enable_if限制可能的模板参数的范围。另见this question

相关问题