我使用C#已有很长时间了,我对C ++中的函数模板有一些疑问。
template <typename T>
T max(T x, T y)
{
return (x > y) ? x : y;
}
Run Code Online (Sandbox Code Playgroud)
typename使用某些示例而使用其他示例class?有什么不同?T到特定类型,或从特定类型派生的类型?更新:
我很感谢所有答案,但是其中一些包含了一些示例,当我尝试将其应用于我的代码时,这些示例将不会编译。
为了澄清问题3,我有以下方法:
template<typename T>
std::unique_ptr<T> ExecuteSqlQuery(LPCTSTR pszSqlQuery, UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE);
Run Code Online (Sandbox Code Playgroud)
我想声明使用CRecordsetas 的此变量的变体T,以使以下任一语句均有效:
auto result = db.ExecuteSqlQuery<CCustomerRecordset>(L"SELECT ...");
auto result = db.ExecuteSqlQuery(L"SELECT ...");
Run Code Online (Sandbox Code Playgroud) 使用是否有任何意义/好处:
<class T>
Run Code Online (Sandbox Code Playgroud)
而不是:
<typename T>
Run Code Online (Sandbox Code Playgroud)
在C++中?
在尝试应用基于策略的设计时,我陷入了困境(简化):
template <class TPrintPolicy, typename T>
struct A : private TPrintPolicy {
using TPrintPolicy::Print;
T t;
void Foo() {
Print(t);
}
};
struct IntPolicy {
void Print(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A<IntPolicy, int> a;
a.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里有一个问题:我应该如何重新定义A类,以便只能为A模板提供策略参数,让它自己推断T,如下所示:
A<IntPolicy> a;
Run Code Online (Sandbox Code Playgroud)
优选地,政策定义不应该比现在复杂得多.有任何想法吗?
编辑:
我忘了提到我不希望策略导出typedef.这当然是简单的解决方案,但不能自己推断T的类型?
我对c ++模板略感困惑.
考虑下面的模板
template<class TYPE>
void function(TYPE data)
Run Code Online (Sandbox Code Playgroud)
和
template<typename TYPE>
void function(TYPE data)
Run Code Online (Sandbox Code Playgroud)
我的困惑正是用作变量标识或类型的typename和class之间的区别.
我有一个练习,其中我必须使用模板类“Garage”,该类将“汽车”或“自行车”作为参数。很简单,但我不断收到错误,因为我显然对模板的理解不够好。这是 :
template<class Car>
class Garage{
Car array[10];
public:
void addCar(int counter1);
void removeCar(int counter1);
void displayContents(int counter1);
};
template<class Motorbike>
class Garage{
Motorbike array[10];
public:
void addMotorbike(int counter2);
void removeMotorbike(int counter2);
void displayContents(int counter2);
};
Run Code Online (Sandbox Code Playgroud)
恰当的 ?我是否必须在类的每个函数前面插入模板?该程序当然包含更多的类和函数,但它是我需要在头脑中整理出来的模板。感谢您抽出宝贵的时间。