我想写一个函数
template <class Arg>
tuple<int, double> calc(Arg arg);
Run Code Online (Sandbox Code Playgroud)
它返回:
[arg,0] if arg is int,
[0,arg] if arg is double
and [0,0] if arg is nor int or double.
Run Code Online (Sandbox Code Playgroud)
我实现这个函数比较arg的类型(Arg)、 i的类型(int) 和d (double)的类型,然后分别等于 i=arg 或 d=arg。但是,如果我想将函数与字符串或其他类型一起使用,而这些类型无法转换为 int/double,则会出现转换错误(很明显,例如,因为我无法将 char* 等同于 int)。 如何绕过 const char* 到 int(或其他不可转换类型到 int)的转换?或者也许这个功能还有另一种实现?
#define GETTYPE(x) typeid(x).name()
template <class Arg>
tuple<int,double> calc(Arg arg)
{
int i = 0;
double d = 0;
if (GETTYPE(arg) == GETTYPE(i))
{
i = arg;
}
else if …Run Code Online (Sandbox Code Playgroud) 我有一个 Button 类,可以显示图像或一行文本,我正在尝试使用模板实现。
如果是文本,则模板类型为:const char*
如果是图像,则模板类型为: const wchar_t*
下面是需要区分这两种类型的方法:
template <typename T>
void Button<T>::draw(EasyGraphics* canvas)
{
canvas->setBackColour(colour);
if (mouseOver)
{
canvas->setPenColour(EasyGraphics::BLACK, 4);
}
else
{
canvas->setPenColour(EasyGraphics::BLACK, 2);
}
canvas->drawRectangle(Entity::GetX(), Entity::GetY(), Entity::getWidth(), Entity::getHeight(), true);
canvas->setFont(20, L"");
canvas->setTextColour(textColour);
switch (typeid(T))
{
// Button has display text
case typeid(const char*):
{
canvas->drawText(displayData, Entity::GetX() + textXOfset, Entity::GetY() + (Entity::getHeight() / 4) - 3);
break;
}
// Button has display image
case typeid(const wchar_t*):
{
canvas->drawBitmap(displayData, Entity::GetX() + textXOfset, Entity::GetY() + (Entity::getHeight() / 4) - …Run Code Online (Sandbox Code Playgroud)