有没有办法为模板参数指定一个必需的定义?
Is there a way to specify a required definition for template arguments?
我可以写这个语法吗:
template <class T{public :SDL_Rect getRect() const; }>
这是为了确保模板参数具有 SDL_Rect getRect() const
但是我得到 error: unexpected Type "T"
。如果我在语法上犯了错误或者根本不允许这样做,有什么建议吗?
你说:
This is to make sure that template class will have SDL_Rect getRect() const
您在错误的位置使用了一些句法元素来实现这一点。
您要查找的代码是:
template <class T> class MyClass
{
public :
SDL_Rect getRect() const;
};
编译器已经回答了你的问题:不行,不允许。
无论如何你都没有在那里声明模板。看起来您正在尝试声明模板 class,但语法完全错误。
很可能,您只需要花一些时间了解模板,即像 http://www.tutorialspoint.com/cplusplus/cpp_templates.htm 这样的网站或一本好书。
This is to make sure that template class will have SDL_Rect getRect()
const
如果你写类似
template<typename T>
class MyClass {
void foo() {
T t;
SDL_Rect r = t.getRect();
}
};
如果 T
没有提供 SDL_Rect getRect()
函数,编译器会报错。
如果您想要更好的编译器错误消息,您可以使用 static_assert
,例如:
template<typename T>
class MyClass {
static_assert(std::is_member_function_pointer<decltype(&T::getRect)>::value,
"T must implement the SDL_Rect getRect() const function");
void foo() {
T t;
SDL_Rect r = t.getRect();
}
};
有概念:
template<class T>
requires requires(const T t) {
{ t.getRect() } -> SDL_Rect;
}
class Meow { };
这会检查 t.getRect()
是否可以隐式转换为 SDL_Rect
。要检查完全匹配,
template<class T, class U> concept bool Same = std::is_same_v<T, U>;
template<class T>
requires requires(const T t) {
{ t.getRect() } -> Same<SDL_Rect>;
}
class Meow { };
我可以写这个语法吗:
template <class T{public :SDL_Rect getRect() const; }>
这是为了确保模板参数具有 SDL_Rect getRect() const
但是我得到 error: unexpected Type "T"
。如果我在语法上犯了错误或者根本不允许这样做,有什么建议吗?
你说:
This is to make sure that template class will have
SDL_Rect getRect() const
您在错误的位置使用了一些句法元素来实现这一点。
您要查找的代码是:
template <class T> class MyClass
{
public :
SDL_Rect getRect() const;
};
编译器已经回答了你的问题:不行,不允许。
无论如何你都没有在那里声明模板。看起来您正在尝试声明模板 class,但语法完全错误。
很可能,您只需要花一些时间了解模板,即像 http://www.tutorialspoint.com/cplusplus/cpp_templates.htm 这样的网站或一本好书。
This is to make sure that template class will have
SDL_Rect getRect()
const
如果你写类似
template<typename T>
class MyClass {
void foo() {
T t;
SDL_Rect r = t.getRect();
}
};
如果 T
没有提供 SDL_Rect getRect()
函数,编译器会报错。
如果您想要更好的编译器错误消息,您可以使用 static_assert
,例如:
template<typename T>
class MyClass {
static_assert(std::is_member_function_pointer<decltype(&T::getRect)>::value,
"T must implement the SDL_Rect getRect() const function");
void foo() {
T t;
SDL_Rect r = t.getRect();
}
};
有概念:
template<class T>
requires requires(const T t) {
{ t.getRect() } -> SDL_Rect;
}
class Meow { };
这会检查 t.getRect()
是否可以隐式转换为 SDL_Rect
。要检查完全匹配,
template<class T, class U> concept bool Same = std::is_same_v<T, U>;
template<class T>
requires requires(const T t) {
{ t.getRect() } -> Same<SDL_Rect>;
}
class Meow { };