Я всегда вижу, что enable_if используется только с условием std::is_integral::value.
Есть ли способ использовать в условии вызов функции функции-члена объекта другого класса шаблонов? Функция, о которой я говорю, должна выглядеть так:
bool someFunc()
{
if (QString(T::staticMetaObject.className()) == QString("Form")) {
return true;
}
return false;
}
В настоящее время я не могу его скомпилировать, независимо от того, что я пытаюсь.
Спасибо за помощь мне.
изменить:
что мой вопрос более понятен, больше кода и сообщение об ошибке.
главное окно.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <type_traits>
#include <QDebug>
template <class T>
typename std::enable_if<Form<MainWindow>::staticThis->someFunc(),bool>::type
is_smth (T* obj) { return true; }
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
form = new Form<MainWindow>;
qDebug() << is_smth(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
главное окно.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "form.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Form<MainWindow>* form;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
форма.ч
#ifndef FORM_H
#define FORM_H
#include <QObject>
class FormBase : public QObject
{
Q_OBJECT
};
template <class T>
class Form : public FormBase
{
public:
Form() {}
static Form* staticThis;
bool someFunc()
{
if (QString(T::staticMetaObject.className()) == QString(Form::staticMetaObject.className())) {
return true;
}
return false;
}
};
#endif // FORM_H
форма.cpp
#include "form.h"
#include "mainwindow.h"
Form<MainWindow>* Form::staticThis = NULL;
ошибка:
значение 'Form::staticThis' нельзя использовать в константном выражении с именем типа std::enable_if::staticThis->someFunc(),bool>::type ^
Я не хочу использовать в условии enable_if функцию из std или что-то в этом роде. Я хочу использовать свою собственную функцию. И я не знаю, как заставить его работать. Может быть, поэтому вы подумаете, что код немного занят. Но я думаю, что теперь он должен показать, чего я пытаюсь достичь.
Еще раз спасибо