考慮下面的代碼片段模板的方法:專業化使用模板類型
struct A {
template <class T >
void doSomething(T t) {
std::cout << "doSomething() with " << t << std::endl;
}
};
template <class T>
struct B {
T val;
};
我如何專注A::doSomething()
爲模板B<T>
?以下「天真」嘗試不會編譯,但可能會解釋我想實現的目標:
template<class T>
void A::doSomething(B<T> t){
std::cout << "doSomething specialized for B: " << t.val << std::endl;
}
是我想實現的目標嗎?如果它是什麼語法?
UPDATE
閱讀此線程,我發現實現的另一種方式是什麼我想: Specialize a template with a template
由於語法並不總是與模板容易,這裏是不同層次的工作示例專長:
#include <iostream>
#include <vector>
namespace details {
template<class T> struct Impl;
}
struct A {
template <class T >
void doSomething(T t) {
details::Impl<T>::f(t);
}
};
template <class T>
struct B {
T val;
};
namespace details {
template<class T>
struct Impl {
static void f(T t){std::cout << "default" << std::endl;}
};
template<template<class> class U, class T>
struct Impl<U<T> > {
static void f(U<T> b){std::cout << "default for U<T>"<< std::endl;}
};
template<>
void Impl<double>::f(double d) {
std::cerr << "doSomething with double " << d << std::endl;
}
template<class T>
struct Impl<B<T> > {
static void f(B<T> b);
};
template<class T>
void Impl<B<T> >::f(B<T> b) {
std::cerr << "doSomething with B<T> " << b.val << std::endl;
}
template<>
void Impl<B<int> >::f(B<int> b) {
std::cerr << "doSomething with B<int> " << b.val << std::endl;
}
}
template<class T>
struct C {
T toto;
};
int main() {
A a;
a.doSomething(12.0);
B<double> b;
b.val = 42.0;
a.doSomething(b);
B<int> b2;
b2.val = 42.0;
a.doSomething(b2);
C<int> c;
a.doSomething(c);
std::vector<int> v;
a.doSomething(v);
return 0;
}
模板偏特僅適用於類。參見例如http://www.gotw.ca/publications/mill17.htm – marom
函數只能是完全專用的。 – Rabbid76
你正在做的是超載(這是首選的方式),但你也必須聲明類中的函數'template void doSomething(B )' –
0x499602D2