有没有办法为模板参数指定必需的定义?

时间:2016-05-02 16:55:18

标签: c++ c++-concepts

我可以写这个语法:

template <class T{public :SDL_Rect getRect() const; }>

这是为了确保模板参数具有SDL_Rect getRect() const

但是我得到了error: unexpected Type "T"。如果我在语法上犯了错误或者根本不允许这样做,有什么建议吗?

4 个答案:

答案 0 :(得分:2)

概念:

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 { };

答案 1 :(得分:1)

  

这是为了确保模板类具有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();
    }
};

答案 2 :(得分:0)

你说:

  

这是为了确保模板类具有SDL_Rect getRect() const

你有一些句法元素在错误的地方来完成它。

您正在寻找的代码是:

template <class T> class MyClass
{
   public :
      SDL_Rect getRect() const;
};

答案 3 :(得分:0)

编译器已经回答了你的问题:不,不允许。

你还没有在那里宣布模板。看起来您正在尝试声明模板类,但语法都错了。

最有可能的是,您只需花一些时间来学习模板,即http://www.tutorialspoint.com/cplusplus/cpp_templates.htm这样的网站或好书。