C++中的模板机制只是偶然地对模板元编程有用.另一方面,D's专门设计用于促进这一点.而且显然它更容易理解(或者我听说过).
我没有D的经验,但是我很好奇,你能用D做什么,而你在模板元编程方面不能用C++做什么?
我有一个模板类,我想要做的是以下内容
(1)如果传递的模板参数不支持该类使用代码的某些功能将无法编译,则会自动处理.但是这个错误可能会很晚才被发现.我希望检查尽可能早.我还想要实现的是,传递的模板参数必须从我提供的基类型派生,这一点应该是显而易见的.
首先,这是误入歧途吗?如果不是我该怎么做?(最简单的方法,C++对我来说还是新手)
感谢stackoverflow,你真的加快了我的C++学习速度.
一位同事最近向我展示了他在网上找到的一些代码.它似乎允许编译时间确定类型是否与另一种类型具有"是"关系.我认为这非常棒,但我不得不承认我对这实际上是如何运作一无所知.任何人都可以向我解释这个吗?
template<typename BaseT, typename DerivedT>
inline bool isRelated(const DerivedT&)
{
DerivedT derived();
char test(const BaseT&); // sizeof(test()) == sizeof(char)
char (&test(...))[2]; // sizeof(test()) == sizeof(char[2])
struct conversion
{
enum { exists = (sizeof(test(derived())) == sizeof(char)) };
};
return conversion::exists;
}
Run Code Online (Sandbox Code Playgroud)
定义此函数后,您可以像这样使用它:
#include <iostream>
class base {};
class derived : public base {};
class unrelated {};
int main()
{
base b;
derived d;
unrelated u;
if( isRelated<base>( b ) )
std::cout << "b is related to base" << std::endl;
if( isRelated<base>( …Run Code Online (Sandbox Code Playgroud) 这样一个例子更容易解释,
class base {
//....
}
class derived1 : public base {
//...
}
Run Code Online (Sandbox Code Playgroud)
在我的库中,有一个基类指针.库的用户必须创建从base或derived1派生的类,并分配指向该类的指针.
如何检查从哪个类派生的用户定义类?
此语法用作此问题答案的一部分:
template <bool>
struct static_assert;
template <>
struct static_assert<true> {}; // only true is defined
#define STATIC_ASSERT(x) static_assert<(x)>()
Run Code Online (Sandbox Code Playgroud)
我不明白那种语法.它是如何工作的?
假设我这样做
STATIC_ASSERT(true);
Run Code Online (Sandbox Code Playgroud)
它被转换为
static_assert<true>();
Run Code Online (Sandbox Code Playgroud)
怎么办?
我有一个函数,它有一个模板类作为参数:
template<class T> void scheduleTask(T* a);
Run Code Online (Sandbox Code Playgroud)
但是我希望调用此函数的类扩展类"Runnnable",在Java中你可以通过以下方式实现:
public <T extends Runnable> void scheduleTask(T a);
Run Code Online (Sandbox Code Playgroud)
如果可以,我将如何在c ++中执行此操作?